## Preprocessed data found — loading it.
## [1] "Found directory for figures, continuing without creating."
## [1] "Found directory for results, continuing without creating."

Useful abbreviations:

  • AF = Arcuate Fasciculus
  • SLF = Superior Longitudinal Fasciculus (SLF II/III)
  • WM = white matter
  • GM = gray matter
  • L = left hemisphere
  • R = right hemisphere
  • AQ = Asymmetry Quotient
  • PCA = Principal Component Analysis (PC_thin, PC_long - first two components of PCA)

Regions of interest: - PMv = ventral Premotor - BA44 = Brodmann Area 44 (pars opercularis) - BA45 = Brodmann Area 45 (pars triangularis) - STG = Superior Temporal Gyrus - MTG = Middle Temporal Gyrus - ITG = Inferior Temporal Gyrus - TP = Temporal pole - SPL = Superior Parietal Lobule - SMG = Supramarginal Gyrus - AG = Angular Gyrus

1 Data description and summary statistics

Table S1. Participant demographics.
Fine motor experience
Gross motor experience
Participant Gender Age Group Craft Years Exp Ability Craft Years Exp Ability Education Lithic Familiarity
1 M 32 exp None 0 NA None 0.0 NA Masters 0
2 F 20 exp Beading 1 1 None 0.0 NA Undergraduate 0
3 F 26 exp Crocheting 3 2 None 0.0 NA Undergraduate 3
4 F 35 exp Knitting 30 5 Carpentry 10.0 3 PhD 2
5 F 43 exp Knitting 1 1 None 0.0 NA Masters 0
6 M 44 exp Painting 20 3 Carpentry 20.0 5 Masters 3
7 F 34 exp Knitting 10 4 None 0.0 NA Undergraduate 0
8 F 21 exp Sewing 2 2 None 0.0 NA Undergraduate 0
9 F 27 exp None 0 NA Carpentry 0.5 1 Masters 0
10 F 21 exp Knitting 5 3 None 0.0 NA Undergraduate 3
11 M 42 exp Painting 11 3 Carpentry 16.0 3 Undergraduate 0
12 F 23 exp None 0 NA None 0.0 NA Undergraduate 0
13 F 17 exp Painting 8 3 None 0.0 NA High school 1
14 M 48 exp None 0 NA Carpentry 35.0 3 Masters 0
15 F 30 exp Painting 15 0 None 0.0 NA Masters 3
16 M 46 exp Painting 3 3 Carpentry 30.0 4 Undergraduate 1
17 F 28 exp Sewing 5 1 None 0.0 NA Undergraduate 3
18 F 42 exp Sewing 11 3 None 0.0 NA Masters 0
19 F 22 exp None 0 None 0.0 NA Masters 3
20 M 36 exp Weaving 1 1 None 0.0 NA High school 0
21 M 22 exp None 0 NA Sculpture/Pottery 7.0 0 Undergraduate 3
22 F 23 con None 0 NA None 0.0 NA NA NA
23 F 21 con None 0 NA None 0.0 NA NA NA
24 F 41 con Beading 15 4 Carpentry 3.0 2 Masters 0
25 F 16 con None 0 NA Sculpture/Pottery 2.0 3 High school 0
26 F 23 con None 0 NA Pottery/Sculpture 2.0 2 NA NA
27 F 19 con Sewing 5 2 None 0.0 NA Undergraduate 1
28 F 20 con None 0 NA None 0.0 NA NA NA
29 F 25 con Knitting 1 1 None 0.0 NA Undergraduate 0
30 F 25 con Sewing 6 2 Carpentry 3.0 1 Undergraduate 0
31 F 37 con Painting 21 5 Sculpture/Pottery 21.0 3 Undergraduate 0
32 M 29 con None 0 NA None 0.0 NA Undergraduate 1
33 F 21 con None 0 NA None 0.0 NA NA NA
34 M 22 con None 0 Na None 0.0 NA High school 1
35 F 35 con Painting 7 3 None 0.0 NA Masters 0
37 F 20 con None 0 NA None 0.0 NA NA NA
38 F 22 con None 0 NA None 0.0 NA NA NA
Note:
The skill with the greatest number of years of experience is show (and considered for analyses).
Table S2. A Descriptive statistics for behavioral measures (pre-training; all participants).
n mean sd se min max range skew
age 37 28.59 9.17 1.51 16.00 48.00 32.00 0.62
gross_motor_experience 37 4.04 8.81 1.45 0.00 35.00 35.00 2.23
fine_motor_experience 37 4.89 7.26 1.19 0.00 30.00 30.00 1.70
toolmaking_performance 26 1.91 0.51 0.10 1.10 2.93 1.83 0.15
PC_thin 30 -1.30 0.62 0.11 -2.32 0.20 2.52 0.40
PC_long 30 -0.13 0.40 0.07 -0.82 0.75 1.57 0.49
syntactic_complexity 26 1.00 0.57 0.11 -0.28 1.99 2.27 -0.22
AGL_d_grammaticality 26 0.62 0.66 0.13 -1.04 1.83 2.87 -0.42
AGL_d_chunk_strength 26 0.34 0.47 0.09 -0.49 1.15 1.64 -0.14
Note:
AGL = Artificial Grammar Learning, n = number of samples, SD = standard deviation, SE = standard error of the mean
Table S2. B Descriptive statistics for behavioral measures (post-training; exp group).
n mean sd se min max range skew
toolmaking_performance 13 3.24 0.64 0.18 1.63 3.84 2.21 -1.23
PC_thin 14 -0.87 0.61 0.16 -2.25 0.13 2.38 -0.44
PC_long 14 0.19 0.49 0.13 -0.36 0.96 1.32 0.38
syntactic_complexity 10 0.63 0.55 0.17 -0.18 1.72 1.90 0.38

2 Tractography results

2.1 Arcuate Fasciculus

2.1.1 Tractography result

2.1.2 White matter measures: average FA, WM tract volume

2.1.3 Gray matter measure: termination volume

2.1.4 Asymmetry Quotients

2.2 Superior Longitudinal Fasciculus (SLF II/III)

2.2.1 Tractography result

2.2.2 White matter measures: average FA, WM tract volume

2.2.3 Gray matter measure: termination volume

2.2.4 Asymmetry Quotients

3 Visualize correlation between behavioral variables

4 Lateralization of brain measures

Table S3 A. Asymmetry of AF and SLF II/III white matter tract measures.
normality
significance test
Variable n W p-value Test Statistic p-value BH q-value
AQ AF averageFA 37 0.944 0.062 t-test 1.247 0.221 0.294
AQ AF volumeWM 37 0.975 0.574 t-test -2.175 0.036 0.072 *
AQ SLF averageFA 37 0.985 0.897 t-test 3.663 0.001 0.003 *
AQ SLF volumeWM 37 0.980 0.745 t-test 0.821 0.417 0.417
Table S3 B. Asymmetry of AF GM temrinations.
normality
significance test
Variable n W p-value Test Statistic p-value BH q-value
AQ AF PMv 37 0.980 0.742 t-test 0.790 0.435 0.608
AQ AF BA44 37 0.964 0.266 t-test -1.608 0.117 0.272
AQ AF BA45 15 0.711 0.000 Wilcoxon signed-rank 60.000 1.000 1.000
AQ AF STG 35 0.782 0.000 Wilcoxon signed-rank 83.500 0.000 0.002 *
AQ AF MTG 37 0.982 0.784 t-test -2.295 0.028 0.097 *
AQ AF ITG 37 0.973 0.502 t-test 1.001 0.324 0.567
AQ AF TP 13 0.737 0.001 Wilcoxon signed-rank 54.000 0.555 0.648
Table S3 C. Asymmetry of SLF II/III GM terminations.
normality
significance test
Variable n W p-value Test Statistic p-value BH q-value
AQ SLF PMv 37 0.988 0.947 t-test 0.971 0.338 0.406
AQ SLF BA44 37 0.963 0.258 t-test -1.334 0.190 0.286
AQ SLF BA45 13 0.731 0.001 Wilcoxon signed-rank 60.000 0.091 0.183 *
AQ SLF SMG 37 0.960 0.201 t-test -0.163 0.872 0.872
AQ SLF AG 37 0.831 0.000 Wilcoxon signed-rank 703.000 0.000 0.000 *
AQ SLF SPL 31 0.535 0.000 Wilcoxon signed-rank 413.000 0.001 0.002 *

5 Influence of prior experience on toolmaking performance (pre-training)

5.1 Effect of motor-skill experience

## 
## Call:
## lm(formula = toolmaking_performance ~ gross_motor_experience + 
##     fine_motor_experience, data = df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.67574 -0.38784 -0.03171  0.39387  0.68611 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             1.781716   0.111587  15.967 6.14e-14 ***
## gross_motor_experience  0.028957   0.009120   3.175  0.00422 ** 
## fine_motor_experience  -0.005978   0.014112  -0.424  0.67579    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4414 on 23 degrees of freedom
## Multiple R-squared:  0.311,  Adjusted R-squared:  0.2511 
## F-statistic: 5.191 on 2 and 23 DF,  p-value: 0.01379

## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  2.8875 0.1022
##       24
## 
## Call:
## lm(formula = toolmaking_performance ~ group + gross_motor_experience, 
##     data = df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.77719 -0.30431  0.06109  0.31506  0.63834 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            1.570636   0.140997  11.139 9.61e-11 ***
## groupexp               0.306552   0.173558   1.766  0.09062 .  
## gross_motor_experience 0.025510   0.008302   3.073  0.00539 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4158 on 23 degrees of freedom
## Multiple R-squared:  0.3886, Adjusted R-squared:  0.3354 
## F-statistic: 7.309 on 2 and 23 DF,  p-value: 0.003491

5.2 Effect of language measures

## 
## Call:
## lm(formula = toolmaking_performance ~ syntactic_complexity + 
##     AGL_d_grammaticality + AGL_d_chunk_strength, data = df)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.6001 -0.3535 -0.1072  0.2618  0.8938 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           2.11819    0.26501   7.993 5.61e-07 ***
## syntactic_complexity -0.41173    0.22346  -1.842    0.084 .  
## AGL_d_grammaticality  0.05603    0.15884   0.353    0.729    
## AGL_d_chunk_strength  0.17093    0.24462   0.699    0.495    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4689 on 16 degrees of freedom
## Multiple R-squared:  0.1799, Adjusted R-squared:  0.02608 
## F-statistic:  1.17 on 3 and 16 DF,  p-value: 0.3522

6 Pre-training partial correlations: toolmaking performance and brain measures

Table S4 A. Partial correlations between toolmaking performance and AQ of WM measures (controlling for gross motor experience).
Brain Measure Partial r n p value BH q value
AQ AF averageFA 0.131 26 0.524 0.699
AQ AF volumeWM 0.056 26 0.784 0.784
AQ SLF averageFA 0.175 26 0.394 0.699
AQ SLF volumeWM -0.366 26 0.066 0.262
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S4 B. Partial correlations between toolmaking performance and AQ of AF GM terminations (controlling for gross motor experience).
Brain Measure Partial r n p value BH q value
AQ AF PMv 0.418 26 0.033 0.117 *
AQ AF BA44 -0.438 26 0.025 0.117 *
AQ AF BA45 -0.541 10 0.106 0.248 *
AQ AF STG -0.136 25 0.516 0.602
AQ AF MTG -0.220 26 0.281 0.393
AQ AF ITG -0.269 26 0.184 0.322
AQ AF TP -0.187 7 0.689 0.689
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S4 C. Partial correlations between toolmaking performance and AQ of SLF II/III GM terminations (controlling for gross motor experience).
Brain Measure Partial r n p value BH q value
AQ SLF PMv 0.304 26 0.132 0.216 *
AQ SLF BA44 -0.408 26 0.039 0.216 *
AQ SLF BA45 -0.651 8 0.081 0.216 *
AQ SLF SMG -0.121 26 0.556 0.585
AQ SLF AG -0.295 26 0.144 0.216 *
AQ SLF SPL -0.130 20 0.585 0.585
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S4 D. Partial correlations between toolmaking performance and WM measures (controlling for gross motor experience).
Brain Measure Partial r n p value BH q value
AF L averageFA 0.158 26 0.440 0.560
AF R averageFA 0.270 26 0.182 0.486
AF L volumeWM 0.206 26 0.314 0.502
AF R volumeWM 0.142 26 0.490 0.560
SLF L averageFA 0.206 26 0.312 0.502
SLF R averageFA 0.378 26 0.057 0.228 *
SLF L volumeWM 0.392 26 0.048 0.228 *
SLF R volumeWM -0.063 26 0.761 0.761
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S4 E. Partial correlations between toolmaking performance and AF left hemisphere GM terminations (controlling for gross motor experience).
Brain Measure Partial r n p value BH q value
AF L PMv -0.270 26 0.183 0.320
AF L BA44 0.437 26 0.026 0.179 *
AF L BA45 0.718 5 0.172 0.320
AF L STG -0.242 24 0.254 0.334
AF L MTG 0.320 26 0.110 0.320
AF L ITG 0.038 25 0.856 0.856
AF L TP -0.598 5 0.286 0.334
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S4 F. Partial correlations between toolmaking performance and AF right hemisphere GM terminations (controlling for gross motor experience).
Brain Measure Partial r n p value BH q value
AF R PMv 0.246 26 0.226 0.396
AF R BA44 -0.075 26 0.715 0.736
AF R BA45 0.836 5 0.078 0.273
AF R STG -0.378 14 0.183 0.396
AF R MTG 0.069 26 0.736 0.736
AF R ITG 0.116 26 0.572 0.736
AF R TP 0.952 4 0.048 0.273
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S4 G. Partial correlations between toolmaking performance and SLF II/III left hemisphere GM terminations (controlling for gross motor experience).
Brain Measure Partial r n p value BH q value
SLF L PMv -0.077 26 0.707 0.707
SLF L BA44 0.332 26 0.097 0.146 *
SLF L BA45 1.000 3 0.000 0.000 *
SLF L SMG 0.459 26 0.018 0.055 *
SLF L AG 0.232 19 0.340 0.408
SLF L SPL 0.932 4 0.068 0.135 *
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S4 H. Partial correlations between toolmaking performance and SLF II/III right hemisphere GM terminations (controlling for gross motor experience).
Brain Measure Partial r n p value BH q value
SLF R PMv 0.223 26 0.273 0.674
SLF R BA44 -0.180 26 0.378 0.674
SLF R BA45 0.071 6 0.893 0.893
SLF R SMG 0.220 26 0.281 0.674
SLF R AG 0.155 26 0.449 0.674
SLF R SPL 0.078 19 0.752 0.893
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).

7 Language aptitude (syntactic complexity) and brain correlations

Table S5 A. Correlation: language aptitude × AQ of WM measures
Syntactic Complexity
Measure Pearson’s r n p-value BH q-value
AQ AF averageFA -0.230 26 0.258 0.884
AQ AF volumeWM 0.156 26 0.447 0.884
AQ SLF averageFA 0.030 26 0.884 0.884
AQ SLF volumeWM 0.087 26 0.674 0.884
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S5 B. Correlation: language aptitude × AQ of AF GM terminations
Syntactic Complexity
Measure Pearson’s r n p-value BH q-value
AQ AF PMv -0.114 26 0.579 0.579
AQ AF BA44 0.185 26 0.364 0.579
AQ AF BA45 0.333 9 0.381 0.579
AQ AF STG 0.134 24 0.533 0.579
AQ AF MTG 0.323 26 0.108 0.579
AQ AF ITG 0.132 26 0.520 0.579
AQ AF TP -0.395 7 0.381 0.579
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S5 C. Correlation: language aptitude × AQ of SLF II/III GM terminations
Syntactic Complexity
Measure Pearson’s r n p-value BH q-value
AQ SLF PMv -0.121 26 0.555 0.694
AQ SLF BA44 0.189 26 0.356 0.694
AQ SLF BA45 0.206 9 0.594 0.694
AQ SLF SMG -0.289 26 0.151 0.640
AQ SLF AG 0.253 26 0.213 0.640
AQ SLF SPL -0.091 21 0.694 0.694
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S5 D. Correlation: language aptitude × WM measures
Syntactic Complexity
Measure Pearson’s r n p-value BH q-value
AF L averageFA 0.022 26 0.913 0.998
AF R averageFA -0.171 26 0.403 0.998
AF L volumeWM 0.000 26 0.998 0.998
AF R volumeWM 0.104 26 0.614 0.998
SLF L averageFA -0.091 26 0.660 0.998
SLF R averageFA -0.071 26 0.730 0.998
SLF L volumeWM -0.023 26 0.911 0.998
SLF R volumeWM 0.075 26 0.717 0.998
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S5 E. Correlation: language aptitude × AF left GM terminations
Syntactic Complexity
Measure Pearson’s r n p-value BH q-value
AF L PMv 0.137 26 0.504 0.846
AF L BA44 -0.107 26 0.604 0.846
AF L BA45 0.017 5 0.979 0.987
AF L STG 0.195 23 0.372 0.846
AF L MTG 0.003 26 0.987 0.987
AF L ITG -0.468 24 0.021 0.127 *
AF L TP -0.998 3 0.036 0.127 *
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S5 F. Correlation: language aptitude × AF right GM terminations
Syntactic Complexity
Measure Pearson’s r n p-value BH q-value
AF R PMv 0.092 26 0.653 0.763
AF R BA44 0.145 26 0.481 0.763
AF R BA45 0.687 5 0.200 0.468
AF R STG 0.138 13 0.654 0.763
AF R MTG 0.321 26 0.110 0.468
AF R ITG -0.039 26 0.851 0.851
AF R TP 0.692 5 0.195 0.468
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S5 G. Correlation: language aptitude × SLF II/III left GM terminations
Syntactic Complexity
Measure Pearson’s r n p-value BH q-value
SLF L PMv 0.220 26 0.281 0.338
SLF L BA44 -0.250 26 0.219 0.328
SLF L BA45 -0.944 4 0.056 0.158 *
SLF L SMG 0.072 26 0.727 0.727
SLF L AG -0.446 18 0.064 0.158 *
SLF L SPL 0.921 4 0.079 0.158 *
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S5 H. Correlation: language aptitude × SLF II/III right GM terminations
Syntactic Complexity
Measure Pearson’s r n p-value BH q-value
SLF R PMv 0.065 26 0.753 0.753
SLF R BA44 -0.103 26 0.617 0.753
SLF R BA45 -0.527 7 0.224 0.448
SLF R SMG -0.249 26 0.220 0.448
SLF R AG 0.080 26 0.696 0.753
SLF R SPL -0.285 20 0.223 0.448
Note:
Asterisk (*) marks BH-adjusted p < 0.25.

8 AGL scores (grammaticality and chunk strength) and brain correlations

Table S6 A. Correlation: AGL scores × AQ of WM measures
AGL d’ grammaticality
AGL d’ chunk strength
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
AQ AF averageFA -0.041 26 0.842 0.939 -0.097 26 0.639 0.939
AQ AF volumeWM 0.296 26 0.142 0.718 -0.189 26 0.355 0.939
AQ SLF averageFA 0.081 26 0.696 0.939 0.016 26 0.939 0.939
AQ SLF volumeWM 0.272 26 0.179 0.718 0.049 26 0.814 0.939
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S6 B. Correlation: AGL scores × AQ of AF GM terminations
AGL d’ grammaticality
AGL d’ chunk strength
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
AQ AF PMv -0.139 26 0.497 0.869 0.278 26 0.169 0.592
AQ AF BA44 0.165 26 0.420 0.869 -0.358 26 0.072 0.506
AQ AF BA45 -0.058 10 0.874 0.941 -0.715 10 0.020 0.282
AQ AF STG 0.008 24 0.970 0.970 -0.300 24 0.154 0.592
AQ AF MTG 0.118 26 0.567 0.872 -0.143 26 0.487 0.869
AQ AF ITG 0.066 26 0.747 0.872 -0.074 26 0.720 0.872
AQ AF TP 0.136 9 0.728 0.872 -0.397 9 0.291 0.814
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S6 C. Correlation: AGL scores × AQ of SLF II/III GM terminations
AGL d’ grammaticality
AGL d’ chunk strength
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
AQ SLF PMv -0.129 26 0.529 0.935 -0.006 26 0.977 0.979
AQ SLF BA44 0.156 26 0.446 0.935 -0.331 26 0.099 0.395
AQ SLF BA45 -0.325 7 0.477 0.935 0.162 7 0.728 0.970
AQ SLF SMG 0.005 26 0.979 0.979 -0.079 26 0.700 0.970
AQ SLF AG -0.124 26 0.545 0.935 0.037 26 0.858 0.979
AQ SLF SPL 0.379 21 0.090 0.395 -0.455 21 0.038 0.395
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S6 D. Correlation: AGL scores × WM measures
AGL d’ grammaticality
AGL d’ chunk strength
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
AF L averageFA 0.074 26 0.720 0.994 0.183 26 0.370 0.988
AF R averageFA 0.025 26 0.905 0.994 0.064 26 0.755 0.994
AF L volumeWM 0.023 26 0.911 0.994 -0.143 26 0.487 0.994
AF R volumeWM 0.232 26 0.253 0.988 -0.205 26 0.316 0.988
SLF L averageFA 0.211 26 0.302 0.988 -0.007 26 0.974 0.994
SLF R averageFA 0.232 26 0.254 0.988 -0.002 26 0.994 0.994
SLF L volumeWM -0.077 26 0.710 0.994 -0.128 26 0.535 0.994
SLF R volumeWM 0.204 26 0.317 0.988 -0.097 26 0.639 0.994
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S6 E. Correlation: AGL scores × AF left GM terminations
AGL d’ grammaticality
AGL d’ chunk strength
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
AF L PMv 0.155 26 0.449 0.787 0.039 26 0.852 0.852
AF L BA44 -0.131 26 0.525 0.806 -0.075 26 0.717 0.828
AF L BA45 0.593 5 0.292 0.716 -0.340 5 0.576 0.806
AF L STG -0.095 23 0.668 0.828 0.451 23 0.031 0.433
AF L MTG 0.060 26 0.769 0.828 0.269 26 0.183 0.716
AF L ITG -0.196 25 0.347 0.716 -0.256 25 0.217 0.716
AF L TP 0.622 5 0.262 0.716 -0.530 5 0.358 0.716
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S6 F. Correlation: AGL scores × AF right GM terminations
AGL d’ grammaticality
AGL d’ chunk strength
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
AF R PMv 0.059 26 0.774 0.897 0.247 26 0.224 0.776
AF R BA44 -0.022 26 0.914 0.914 -0.346 26 0.083 0.776
AF R BA45 0.282 6 0.588 0.776 -0.457 6 0.362 0.776
AF R STG 0.299 14 0.299 0.776 -0.190 14 0.514 0.776
AF R MTG 0.169 26 0.410 0.776 0.105 26 0.610 0.776
AF R ITG -0.043 26 0.833 0.897 -0.310 26 0.124 0.776
AF R TP 0.601 6 0.207 0.776 -0.326 6 0.528 0.776
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S6 G. Correlation: AGL scores × SLF II/III left GM terminations
AGL d’ grammaticality
AGL d’ chunk strength
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
SLF L PMv 0.155 26 0.450 0.961 0.025 26 0.904 0.961
SLF L BA44 -0.196 26 0.338 0.961 0.036 26 0.863 0.961
SLF L BA45 -0.763 3 0.447 0.961 1.000 3 0.012 0.139 *
SLF L SMG 0.128 26 0.533 0.961 -0.010 26 0.961 0.961
SLF L AG 0.244 19 0.315 0.961 0.014 19 0.954 0.961
SLF L SPL 0.220 5 0.722 0.961 -0.160 5 0.798 0.961
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S6 H. Correlation: AGL scores × SLF II/III right GM terminations
AGL d’ grammaticality
AGL d’ chunk strength
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
SLF R PMv 0.004 26 0.984 0.994 0.085 26 0.680 0.994
SLF R BA44 -0.029 26 0.888 0.994 -0.305 26 0.130 0.780
SLF R BA45 -0.174 6 0.742 0.994 0.756 6 0.082 0.780
SLF R SMG 0.081 26 0.695 0.994 0.002 26 0.994 0.994
SLF R AG 0.005 26 0.981 0.994 -0.123 26 0.549 0.994
SLF R SPL 0.197 20 0.404 0.994 -0.280 20 0.231 0.925
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
# Mixed-design ANOVA for training effects
Table S7 A. Mixed design ANOVA for AQ WM measures.
Effect: group
Effect: training
Effect: group × training
Variable F p-value \(\eta G^2\) F p-value \(\eta G^2\) F n p-value \(\eta G^2\) adj p-value
AQ AF averageFA 0.001 0.973 0.000 1.773 0.196 0.038 3.873 26 0.061 0.080 0.243 *
AQ AF volumeWM 0.071 0.792 0.002 0.086 0.772 0.001 1.253 26 0.274 0.013 0.377
AQ SLF averageFA 1.286 0.268 0.032 3.917 0.059 0.060 0.890 26 0.355 0.014 0.377
AQ SLF volumeWM 0.347 0.561 0.011 0.014 0.907 0.000 0.812 26 0.377 0.007 0.377
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S7 B. Mixed design ANOVA for AQ of AF GM terminations.
Effect: group
Effect: training
Effect: group × training
Variable F p-value \(\eta G^2\) F p-value \(\eta G^2\) F n p-value \(\eta G^2\) adj p-value
AQ AF PMv 0.066 0.799 0.002 1.420 0.245 0.025 0.306 26 0.585 0.006 0.683
AQ AF BA44 1.142 0.296 0.033 0.026 0.873 0.000 2.848 26 0.104 0.033 0.286
AQ AF BA45 0.226 0.659 0.045 0.088 0.782 0.004 1.763 6 0.255 0.067 0.446
AQ AF STG 2.329 0.141 0.074 0.652 0.428 0.007 4.235 24 0.052 0.044 0.286
AQ AF MTG 1.326 0.261 0.037 2.497 0.127 0.031 2.564 26 0.122 0.032 0.286
AQ AF ITG 1.614 0.216 0.039 1.670 0.209 0.027 0.120 26 0.732 0.002 0.732
AQ AF TP 0.162 0.726 0.065 1.000 0.423 0.065 1.000 4 0.423 0.065 0.592
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S7 C. Mixed design ANOVA for AQ of SLF II/III GM terminations.
Effect: group
Effect: training
Effect: group × training
Variable F p-value \(\eta G^2\) F p-value \(\eta G^2\) F n p-value \(\eta G^2\) adj p-value
AQ SLF PMv 0.000 0.987 0.000 0.197 0.661 0.003 0.796 26 0.381 0.013 0.572
AQ SLF BA44 1.470 0.237 0.046 0.007 0.934 0.000 13.282 26 0.001 0.109 0.008 *
AQ SLF BA45 0.003 0.957 0.001 0.580 0.480 0.022 1.943 7 0.222 0.070 0.444
AQ SLF SMG 0.759 0.392 0.023 0.007 0.933 0.000 0.015 26 0.904 0.000 0.904
AQ SLF AG 3.209 0.086 0.058 3.201 0.086 0.067 2.086 26 0.162 0.045 0.444
AQ SLF SPL 0.446 0.514 0.018 0.029 0.866 0.001 0.123 18 0.730 0.003 0.876
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S7 D. Mixed design ANOVA for WM measures.
Effect: group
Effect: training
Effect: group × training
Variable F p-value \(\eta G^2\) F p-value \(\eta G^2\) F n p-value \(\eta G^2\) adj p-value
AF L averageFA 4.365 0.047 0.117 3.757 0.064 0.041 0.937 26 0.343 0.010 0.687
AF R averageFA 4.387 0.047 0.114 11.083 0.003 0.121 1.771 26 0.196 0.022 0.687
AF L volumeWM 0.088 0.769 0.003 0.023 0.880 0.000 0.287 26 0.597 0.002 0.796
AF R volumeWM 0.106 0.748 0.004 0.316 0.579 0.002 0.362 26 0.553 0.002 0.796
SLF L averageFA 1.634 0.213 0.053 0.716 0.406 0.005 2.482 26 0.128 0.018 0.687
SLF R averageFA 3.794 0.063 0.100 5.958 0.022 0.068 0.000 26 1.000 0.000 1.000
SLF L volumeWM 0.135 0.717 0.005 1.249 0.275 0.008 0.028 26 0.868 0.000 0.992
SLF R volumeWM 0.078 0.783 0.003 1.740 0.200 0.012 0.933 26 0.344 0.006 0.687
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S7 E. Mixed design ANOVA for AF left GM terminations.
Effect: group
Effect: training
Effect: group × training
Variable F p-value \(\eta G^2\) F p-value \(\eta G^2\) F n p-value \(\eta G^2\) adj p-value
AF L PMv 2.623 0.118 0.082 0.346 0.562 0.003 0.112 26 0.741 0.001 0.802
AF L BA44 0.118 0.734 0.004 3.160 0.088 0.028 1.111 26 0.302 0.010 0.504
AF L BA45 NA NA NA NA NA NA NA 3 NA NA NA
AF L STG 0.107 0.747 0.004 0.664 0.424 0.008 4.990 23 0.037 0.057 0.183 *
AF L MTG 5.309 0.030 0.146 5.430 0.029 0.049 3.328 26 0.081 0.031 0.201 *
AF L ITG 0.510 0.482 0.013 5.522 0.028 0.087 0.064 25 0.802 0.001 0.802
AF L TP NA NA NA NA NA NA NA 2 NA NA NA
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S7 F. Mixed design ANOVA for AF right GM terminations.
Effect: group
Effect: training
Effect: group × training
Variable F p-value \(\eta G^2\) F p-value \(\eta G^2\) F n p-value \(\eta G^2\) adj p-value
AF R PMv 1.785 0.194 0.049 3.988 0.057 0.049 0.097 26 0.758 0.001 0.977
AF R BA44 2.806 0.107 0.092 0.166 0.688 0.001 0.001 25 0.977 0.000 0.977
AF R BA45 1.265 0.378 0.385 0.077 0.808 0.000 17.308 4 0.053 0.065 0.319
AF R STG 0.148 0.709 0.010 1.889 0.203 0.075 0.605 11 0.457 0.025 0.977
AF R MTG 12.729 0.002 0.272 9.406 0.005 0.103 0.053 26 0.821 0.001 0.977
AF R ITG 0.320 0.577 0.007 2.813 0.108 0.059 0.025 24 0.875 0.001 0.977
AF R TP NA NA NA NA NA NA NA 2 NA NA NA
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S7 G. Mixed design ANOVA for SLF II/III left GM terminations.
Effect: group
Effect: training
Effect: group × training
Variable F p-value \(\eta G^2\) F p-value \(\eta G^2\) F n p-value \(\eta G^2\) adj p-value
SLF L PMv 2.305 0.142 0.075 1.031 0.320 0.007 0.901 26 0.352 0.006 0.540
SLF L BA44 0.493 0.489 0.017 4.796 0.038 0.028 4.284 26 0.049 0.025 0.198 *
SLF L BA45 NA NA NA NA NA NA NA 2 NA NA NA
SLF L SMG 1.315 0.263 0.038 3.528 0.073 0.040 0.015 26 0.902 0.000 0.902
SLF L AG 0.760 0.396 0.030 0.500 0.490 0.011 0.733 18 0.405 0.016 0.540
SLF L SPL NA NA NA NA NA NA NA 3 NA NA NA
Note:
Asterisk (*) marks BH-adjusted p < 0.25.
Table S7 H. Mixed design ANOVA for SLF II/III right GM terminations.
Effect: group
Effect: training
Effect: group × training
Variable F p-value \(\eta G^2\) F p-value \(\eta G^2\) F n p-value \(\eta G^2\) adj p-value
SLF R PMv 3.708 0.066 0.093 2.648 0.117 0.035 0.357 26 0.556 0.005 0.936
SLF R BA44 5.920 0.023 0.162 0.054 0.818 0.000 3.216 26 0.086 0.028 0.513
SLF R BA45 0.620 0.475 0.106 1.170 0.340 0.065 0.090 6 0.780 0.005 0.936
SLF R SMG 0.642 0.431 0.016 2.328 0.140 0.037 0.001 26 0.977 0.000 0.977
SLF R AG 5.003 0.035 0.113 2.010 0.170 0.035 0.283 25 0.600 0.005 0.936
SLF R SPL 1.918 0.186 0.066 2.717 0.120 0.074 0.153 17 0.701 0.004 0.936
Note:
Asterisk (*) marks BH-adjusted p < 0.25.

8.1 Post-hoc analyses after ANOVA

9 Pre-post training changes in correlations

Table S8 A. Pre–post change in partial correlations (controlling gross motor experience) for AQ WM measures.
Pre-training
Post-training
Change in association
Variable Partial r (pre) p-value (pre) Partial r (post) p-value (post) Δr (post−pre) n Z (Steiger) p-value (change) BH q-value
AQ AF averageFA 0.165 0.591 -0.017 0.956 -0.182 13 0.408 0.684 0.959
AQ AF volumeWM -0.249 0.412 -0.232 0.446 0.017 13 -0.052 0.959 0.959
AQ SLF averageFA 0.180 0.557 0.119 0.698 -0.060 13 0.144 0.886 0.959
AQ SLF volumeWM -0.183 0.549 -0.319 0.288 -0.136 13 0.421 0.674 0.959
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S8 B. Pre–post change in partial correlations (controlling gross motor experience) for AQ AF GM terminations.
Pre-training
Post-training
Change in association
Variable Partial r (pre) p-value (pre) Partial r (post) p-value (post) Δr (post−pre) n Z (Steiger) p-value (change) BH q-value
AQ AF PMv 0.073 0.812 -0.057 0.854 -0.130 13 0.294 0.769 0.769
AQ AF BA44 -0.411 0.163 -0.071 0.817 0.340 13 -0.930 0.352 0.444
AQ AF BA45 NA NA NA NA NA 3 NA NA NA
AQ AF STG 0.170 0.578 -0.261 0.390 -0.431 13 0.925 0.355 0.444
AQ AF MTG -0.224 0.461 0.207 0.498 0.431 13 -1.092 0.275 0.444
AQ AF ITG -0.804 0.001 0.082 0.789 0.886 13 -2.540 0.011 0.055 *
AQ AF TP NA NA NA NA NA 2 NA NA NA
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S8 C. Pre–post change in partial correlations (controlling gross motor experience) for AQ SLF II/III GM terminations.
Pre-training
Post-training
Change in association
Variable Partial r (pre) p-value (pre) Partial r (post) p-value (post) Δr (post−pre) n Z (Steiger) p-value (change) BH q-value
AQ SLF PMv -0.003 0.993 0.036 0.906 0.039 13 -0.089 0.929 0.929
AQ SLF BA44 -0.165 0.591 0.133 0.666 0.297 13 -0.805 0.421 0.701
AQ SLF BA45 NA NA NA NA NA 2 NA NA NA
AQ SLF SMG -0.076 0.806 0.501 0.081 0.576 13 -1.710 0.087 0.218 *
AQ SLF AG -0.722 0.005 0.004 0.990 0.726 13 -2.143 0.032 0.161 *
AQ SLF SPL -0.443 0.272 -0.294 0.480 0.149 8 -0.270 0.787 0.929
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S8 D. Pre–post change in partial correlations (controlling gross motor experience) for WM measures.
Pre-training
Post-training
Change in association
Variable Partial r (pre) p-value (pre) Partial r (post) p-value (post) Δr (post−pre) n Z (Steiger) p-value (change) BH q-value
AF L averageFA -0.049 0.872 0.397 0.180 0.446 13 -1.210 0.226 0.841
AF R averageFA 0.173 0.573 0.403 0.172 0.231 13 -0.555 0.579 0.879
AF L volumeWM -0.349 0.243 0.103 0.737 0.452 13 -1.233 0.217 0.841
AF R volumeWM -0.386 0.193 -0.092 0.764 0.293 13 -0.891 0.373 0.841
SLF L averageFA 0.185 0.545 0.448 0.124 0.263 13 -0.806 0.420 0.841
SLF R averageFA 0.462 0.112 0.404 0.171 -0.058 13 0.153 0.879 0.879
SLF L volumeWM 0.315 0.295 0.387 0.191 0.073 13 -0.229 0.819 0.879
SLF R volumeWM 0.092 0.764 -0.026 0.932 -0.119 13 0.327 0.744 0.879
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S8 E. Pre–post change in partial correlations (controlling gross motor experience) for AF left GM terminations.
Pre-training
Post-training
Change in association
Variable Partial r (pre) p-value (pre) Partial r (post) p-value (post) Δr (post−pre) n Z (Steiger) p-value (change) BH q-value
AF L PMv -0.103 0.738 0.199 0.514 0.302 13 -0.848 0.396 0.819
AF L BA44 0.139 0.651 0.165 0.590 0.026 13 -0.068 0.946 0.946
AF L BA45 NA NA NA NA NA 1 NA NA NA
AF L STG -0.489 0.090 -0.058 0.849 0.431 13 -1.418 0.156 0.781
AF L MTG 0.031 0.921 0.271 0.370 0.241 13 -0.688 0.492 0.819
AF L ITG 0.123 0.688 0.285 0.345 0.162 13 -0.368 0.713 0.891
AF L TP NA NA NA NA NA 1 NA NA NA
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S8 F. Pre–post change in partial correlations (controlling gross motor experience) for AF right GM terminations.
Pre-training
Post-training
Change in association
Variable Partial r (pre) p-value (pre) Partial r (post) p-value (post) Δr (post−pre) n Z (Steiger) p-value (change) BH q-value
AF R PMv -0.288 0.340 0.249 0.413 0.536 13 -1.519 0.129 0.178 *
AF R BA44 -0.291 0.334 0.429 0.144 0.720 13 -2.089 0.037 0.178 *
AF R BA45 NA NA NA NA NA 2 NA NA NA
AF R STG -0.997 0.003 -0.839 0.161 0.158 4 -1.085 0.278 0.278
AF R MTG -0.170 0.579 0.420 0.153 0.589 13 -1.628 0.103 0.178 *
AF R ITG -0.508 0.111 0.216 0.524 0.723 11 -1.467 0.142 0.178 *
AF R TP NA NA NA NA NA 1 NA NA NA
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S8 G. Pre–post change in partial correlations (controlling gross motor experience) for SLF II/III left GM terminations.
Pre-training
Post-training
Change in association
Variable Partial r (pre) p-value (pre) Partial r (post) p-value (post) Δr (post−pre) n Z (Steiger) p-value (change) BH q-value
SLF L PMv 0.077 0.802 0.310 0.302 0.233 13 -0.747 0.455 0.769
SLF L BA44 0.056 0.856 0.235 0.440 0.179 13 -0.491 0.623 0.769
SLF L BA45 NA NA NA NA NA 1 NA NA NA
SLF L SMG 0.520 0.069 0.427 0.146 -0.093 13 0.294 0.769 0.769
SLF L AG 0.523 0.121 -0.104 0.774 -0.627 10 1.471 0.141 0.565
SLF L SPL NA NA NA NA NA 0 NA NA NA
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S8 H. Pre–post change in partial correlations (controlling gross motor experience) for SLF II/III right GM terminations.
Pre-training
Post-training
Change in association
Variable Partial r (pre) p-value (pre) Partial r (post) p-value (post) Δr (post−pre) n Z (Steiger) p-value (change) BH q-value
SLF R PMv -0.113 0.713 0.323 0.281 0.437 13 -1.162 0.245 0.306
SLF R BA44 -0.158 0.606 0.497 0.084 0.655 13 -1.926 0.054 0.270
SLF R BA45 NA NA NA NA NA 2 NA NA NA
SLF R SMG 0.135 0.661 0.599 0.031 0.464 13 -1.292 0.196 0.306
SLF R AG -0.116 0.707 0.391 0.186 0.507 13 -1.170 0.242 0.306
SLF R SPL 0.414 0.308 0.728 0.041 0.314 8 -0.908 0.364 0.364
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).

10 Handaxe morphology

10.1 Check if we need to control for gross-motor experience

Call: lm(formula = PC_thin ~ gross_motor_experience + fine_motor_experience, data = df)

Residuals: Min 1Q Median 3Q Max -0.97560 -0.46999 -0.04225 0.35614 1.56201

Coefficients: Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.33192 0.14129 -9.427 4.96e-10 *** gross_motor_experience 0.02008 0.01256 1.599 0.122
fine_motor_experience -0.01292 0.01918 -0.674 0.506
— Signif. codes: 0 ‘’ 0.001 ’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1

Residual standard error: 0.6153 on 27 degrees of freedom (7 observations deleted due to missingness) Multiple R-squared: 0.08746, Adjusted R-squared: 0.01986 F-statistic: 1.294 on 2 and 27 DF, p-value: 0.2907

Call: lm(formula = PC_long ~ gross_motor_experience + fine_motor_experience, data = df)

Residuals: Min 1Q Median 3Q Max -0.73849 -0.23490 -0.04482 0.19575 0.89252

Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.138770 0.095346 -1.455 0.157 gross_motor_experience 0.003149 0.008474 0.372 0.713 fine_motor_experience -0.001013 0.012944 -0.078 0.938

Residual standard error: 0.4152 on 27 degrees of freedom (7 observations deleted due to missingness) Multiple R-squared: 0.005152, Adjusted R-squared: -0.06854 F-statistic: 0.06992 on 2 and 27 DF, p-value: 0.9326

10.2 run analysis

Table S9.A. Correlation: PCA components × AQ of WM measures (PRE)
PC thin (corss-sectional thinning)
PC long (elongation and pointedness)
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
AQ AF averageFA -0.270 30 0.149 0.299 -0.499 30 0.005 0.040 *
AQ AF volumeWM -0.024 30 0.902 0.992 0.202 30 0.285 0.394
AQ SLF averageFA -0.197 30 0.296 0.394 -0.374 30 0.042 0.168 *
AQ SLF volumeWM -0.276 30 0.140 0.299 0.002 30 0.992 0.992
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S9.B. Correlation: PCA components × AQ of AF GM terminations (PRE)
PC thin (corss-sectional thinning)
PC long (elongation and pointedness)
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
AQ AF PMv -0.040 30 0.834 0.896 -0.113 30 0.552 0.896
AQ AF BA44 -0.107 30 0.573 0.896 0.057 30 0.765 0.896
AQ AF BA45 0.085 12 0.793 0.896 -0.057 12 0.859 0.896
AQ AF STG -0.046 28 0.816 0.896 0.061 28 0.759 0.896
AQ AF MTG -0.042 30 0.827 0.896 0.126 30 0.508 0.896
AQ AF ITG -0.135 30 0.476 0.896 0.025 30 0.896 0.896
AQ AF TP 0.528 9 0.144 0.896 0.136 9 0.728 0.896
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S9.C. Correlation: PCA components × AQ of SLF II/III GM terminations (PRE)
PC thin (corss-sectional thinning)
PC long (elongation and pointedness)
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
AQ SLF PMv -0.195 30 0.301 0.903 -0.039 30 0.840 0.953
AQ SLF BA44 0.028 30 0.883 0.953 0.031 30 0.872 0.953
AQ SLF BA45 -0.514 10 0.129 0.903 -0.424 10 0.222 0.903
AQ SLF SMG -0.079 30 0.678 0.953 -0.063 30 0.740 0.953
AQ SLF AG -0.064 30 0.735 0.953 -0.197 30 0.296 0.903
AQ SLF SPL -0.013 24 0.953 0.953 -0.024 24 0.910 0.953
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S9.D. Correlation: PCA components × WM measures (PRE)
PC thin (corss-sectional thinning)
PC long (elongation and pointedness)
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
AF L averageFA 0.079 30 0.679 0.724 0.300 30 0.108 0.301
AF R averageFA -0.166 30 0.381 0.554 -0.168 30 0.375 0.554
AF L volumeWM 0.214 30 0.256 0.512 0.323 30 0.082 0.301
AF R volumeWM 0.098 30 0.606 0.693 0.381 30 0.038 0.301
SLF L averageFA 0.039 30 0.839 0.839 0.269 30 0.151 0.344
SLF R averageFA -0.154 30 0.415 0.554 -0.131 30 0.492 0.605
SLF L volumeWM 0.428 30 0.018 0.293 0.295 30 0.113 0.301
SLF R volumeWM 0.193 30 0.306 0.544 0.334 30 0.072 0.301
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S9.E. Correlation: PCA components × AF left GM terminations (PRE)
PC thin (corss-sectional thinning)
PC long (elongation and pointedness)
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
AF L PMv -0.228 30 0.226 0.894 -0.068 30 0.720 0.894
AF L BA44 0.231 30 0.220 0.894 0.131 30 0.489 0.894
AF L BA45 -0.014 7 0.976 0.976 0.108 7 0.817 0.894
AF L STG -0.183 27 0.361 0.894 0.043 27 0.830 0.894
AF L MTG 0.098 30 0.607 0.894 0.153 30 0.419 0.894
AF L ITG -0.088 28 0.656 0.894 -0.260 28 0.181 0.894
AF L TP -0.345 5 0.569 0.894 -0.239 5 0.699 0.894
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S9.F. Correlation: PCA components × AF right GM terminations (PRE)
PC thin (corss-sectional thinning)
PC long (elongation and pointedness)
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
AF R PMv -0.139 30 0.465 0.935 0.013 30 0.947 0.981
AF R BA44 0.112 30 0.556 0.935 0.288 30 0.123 0.935
AF R BA45 0.185 6 0.726 0.981 0.086 6 0.871 0.981
AF R STG -0.360 16 0.170 0.935 -0.144 16 0.596 0.935
AF R MTG -0.004 30 0.981 0.981 0.113 30 0.552 0.935
AF R ITG -0.188 30 0.319 0.935 -0.099 30 0.601 0.935
AF R TP -0.020 6 0.970 0.981 0.313 6 0.546 0.935
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S9.G. Correlation: PCA components × SLF II/III left GM terminations (PRE)
PC thin (corss-sectional thinning)
PC long (elongation and pointedness)
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
SLF L PMv -0.077 30 0.684 0.978 -0.021 30 0.913 0.978
SLF L BA44 0.121 30 0.523 0.978 0.014 30 0.940 0.978
SLF L BA45 0.760 5 0.136 0.978 0.017 5 0.978 0.978
SLF L SMG -0.031 30 0.871 0.978 -0.110 30 0.564 0.978
SLF L AG 0.027 22 0.906 0.978 0.078 22 0.729 0.978
SLF L SPL -0.478 6 0.337 0.978 -0.247 6 0.638 0.978
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
Table S9.H. Correlation: PCA components × SLF II/III right GM terminations (PRE)
PC thin (corss-sectional thinning)
PC long (elongation and pointedness)
Measure Pearson’s r n p-value BH q-value Pearson’s r n p-value BH q-value
SLF R PMv -0.193 30 0.306 0.845 -0.053 30 0.779 0.942
SLF R BA44 0.152 30 0.423 0.845 0.115 30 0.544 0.863
SLF R BA45 -0.066 8 0.876 0.942 -0.465 8 0.246 0.845
SLF R SMG -0.161 30 0.394 0.845 -0.169 30 0.371 0.845
SLF R AG -0.014 30 0.942 0.942 0.107 30 0.575 0.863
SLF R SPL -0.046 23 0.835 0.942 -0.186 23 0.396 0.845
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).

11 Change in PCA-brain correlations

Table S10.A. Pre–post change: PCA components × AQ of WM measures (EXP)
PC thin (cross-sectional thinning)
PC long (elongation and pointedness)
pre-training
post-training
comparison
pre-training
post-training
comparison
variable r n p r n p Z p BH q r n p r n p Z p BH q
AQ AF averageFA -0.35 13 0.24 0.17 13 0.59 -1.19 0.23 0.64 -0.69 13 0.01 0.22 13 0.47 -2.35 0.02 0.04 *
AQ AF volumeWM 0.10 13 0.74 -0.03 13 0.93 0.33 0.74 0.74 0.60 13 0.03 -0.29 13 0.33 2.30 0.02 0.04 *
AQ SLF averageFA -0.22 13 0.48 0.21 13 0.49 -1.00 0.32 0.64 -0.57 13 0.04 0.15 13 0.63 -1.76 0.08 0.11 *
AQ SLF volumeWM -0.27 13 0.38 -0.06 13 0.84 -0.55 0.58 0.74 0.34 13 0.25 0.24 13 0.43 0.26 0.80 0.80
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
[1] “figures/pre-post_toolmaking_PCA_AQ_WM.png”
Table S10.B. Pre–post change: PCA components × AQ of AF GM terminations (EXP)
PC thin (cross-sectional thinning)
PC long (elongation and pointedness)
pre-training
post-training
comparison
pre-training
post-training
comparison
variable r n p r n p Z p BH q r n p r n p Z p BH q
AQ AF PMv -0.28 13 0.36 0.02 13 0.94 -0.69 0.49 0.82 -0.62 13 0.02 -0.20 13 0.52 -1.17 0.24 0.40
AQ AF BA44 0.02 13 0.94 0.02 13 0.95 0.01 0.99 0.99 0.60 13 0.03 0.10 13 0.74 1.40 0.16 0.40
AQ AF BA45 NA 3 NA NA 3 NA NA NA NA NA 3 NA NA 3 NA NA NA NA
AQ AF STG 0.18 13 0.56 -0.27 13 0.38 0.98 0.33 0.82 0.38 13 0.20 -0.35 13 0.25 1.70 0.09 0.40
AQ AF MTG -0.08 13 0.78 -0.01 13 0.97 -0.17 0.86 0.99 0.32 13 0.29 0.28 13 0.35 0.10 0.92 0.92
AQ AF ITG -0.04 13 0.89 0.33 13 0.28 -0.86 0.39 0.82 0.06 13 0.83 -0.28 13 0.35 0.77 0.44 0.55
AQ AF TP NA 2 NA NA 2 NA NA NA NA NA 2 NA NA 2 NA NA NA NA
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
[1] “figures/pre-post_toolmaking_PCA_AQ_AF.png”
Table S10.C. Pre–post change: PCA components × AQ of SLF II/III GM terminations (EXP)
PC thin (cross-sectional thinning)
PC long (elongation and pointedness)
pre-training
post-training
comparison
pre-training
post-training
comparison
variable r n p r n p Z p BH q r n p r n p Z p BH q
AQ SLF PMv -0.36 13 0.23 0.28 13 0.35 -1.53 0.13 0.63 -0.35 13 0.24 0.13 13 0.67 -1.11 0.27 0.90
AQ SLF BA44 0.06 13 0.83 -0.15 13 0.62 0.58 0.56 0.70 0.39 13 0.19 0.06 13 0.84 0.81 0.42 0.90
AQ SLF BA45 NA 2 NA NA 2 NA NA NA NA NA 2 NA NA 2 NA NA NA NA
AQ SLF SMG -0.09 13 0.78 0.13 13 0.68 -0.58 0.56 0.70 -0.04 13 0.90 0.13 13 0.67 -0.39 0.69 0.90
AQ SLF AG -0.25 13 0.41 0.03 13 0.93 -0.67 0.50 0.70 -0.03 13 0.93 0.04 13 0.89 -0.17 0.87 0.90
AQ SLF SPL -0.13 8 0.75 -0.33 8 0.42 0.29 0.77 0.77 0.05 8 0.91 0.13 8 0.75 -0.12 0.90 0.90
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
[1] “figures/pre-post_toolmaking_PCA_AQ_SLF.png”
Table S10.D. Pre–post change: PCA components × WM measures (EXP)
PC thin (cross-sectional thinning)
PC long (elongation and pointedness)
pre-training
post-training
comparison
pre-training
post-training
comparison
variable r n p r n p Z p BH q r n p r n p Z p BH q
AF L averageFA -0.16 13 0.59 0.24 13 0.42 -1.09 0.28 0.44 0.38 13 0.20 0.25 13 0.41 0.31 0.76 0.80
AF R averageFA -0.61 13 0.03 0.40 13 0.18 -2.60 0.01 0.08 * -0.51 13 0.07 0.45 13 0.12 -2.40 0.02 0.13 *
AF L volumeWM -0.01 13 0.97 0.14 13 0.64 -0.43 0.67 0.76 0.18 13 0.55 0.07 13 0.83 0.29 0.77 0.80
AF R volumeWM 0.05 13 0.88 0.10 13 0.74 -0.16 0.87 0.87 0.53 13 0.06 -0.16 13 0.61 1.77 0.08 0.21 *
SLF L averageFA -0.25 13 0.42 0.26 13 0.39 -1.45 0.15 0.39 0.24 13 0.44 0.34 13 0.25 -0.26 0.80 0.80
SLF R averageFA -0.51 13 0.07 0.37 13 0.21 -2.07 0.04 0.15 * -0.46 13 0.11 0.36 13 0.22 -1.99 0.05 0.19 *
SLF L volumeWM 0.59 13 0.03 0.17 13 0.57 1.28 0.20 0.40 0.08 13 0.81 -0.27 13 0.38 0.78 0.44 0.70
SLF R volumeWM 0.35 13 0.24 0.07 13 0.81 0.85 0.40 0.53 0.54 13 0.06 -0.02 13 0.94 1.46 0.15 0.29
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
[1] “figures/pre-post_toolmaking_PCA_WM.png”
Table S10.E. Pre–post change: PCA components × AF left GM terminations (EXP)
PC thin (cross-sectional thinning)
PC long (elongation and pointedness)
pre-training
post-training
comparison
pre-training
post-training
comparison
variable r n p r n p Z p BH q r n p r n p Z p BH q
AF L PMv -0.48 13 0.10 -0.11 13 0.72 -1.19 0.23 0.39 0.21 13 0.49 0.15 13 0.63 0.15 0.88 0.92
AF L BA44 0.24 13 0.42 0.45 13 0.13 -0.58 0.56 0.56 -0.25 13 0.40 0.16 13 0.59 -0.99 0.32 0.81
AF L BA45 NA 1 NA NA 1 NA NA NA NA NA 1 NA NA 1 NA NA NA NA
AF L STG -0.41 13 0.17 0.03 13 0.94 -1.48 0.14 0.35 -0.05 13 0.86 -0.01 13 0.97 -0.10 0.92 0.92
AF L MTG -0.12 13 0.70 0.44 13 0.14 -1.59 0.11 0.35 0.12 13 0.70 0.21 13 0.50 -0.21 0.84 0.92
AF L ITG -0.24 13 0.43 0.11 13 0.73 -0.79 0.43 0.54 -0.28 13 0.36 0.29 13 0.34 -1.28 0.20 0.81
AF L TP NA 1 NA NA 1 NA NA NA NA NA 1 NA NA 1 NA NA NA NA
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
[1] “figures/pre-post_toolmaking_PCA_AF_L.png”
Table S10.F. Pre–post change: PCA components × AF right GM terminations (EXP)
PC thin (cross-sectional thinning)
PC long (elongation and pointedness)
pre-training
post-training
comparison
pre-training
post-training
comparison
variable r n p r n p Z p BH q r n p r n p Z p BH q
AF R PMv -0.58 13 0.04 0.10 13 0.74 -2.07 0.04 0.19 * -0.22 13 0.48 0.19 13 0.54 -0.96 0.34 0.42
AF R BA44 0.38 13 0.21 0.62 13 0.02 -0.95 0.34 0.43 0.69 13 0.01 0.16 13 0.60 1.63 0.10 0.41
AF R BA45 NA 2 NA NA 2 NA NA NA NA NA 2 NA NA 2 NA NA NA NA
AF R STG -0.79 4 0.21 -0.82 4 0.18 0.04 0.96 0.96 -0.05 4 0.95 -0.92 4 0.08 1.21 0.22 0.41
AF R MTG -0.19 13 0.54 0.44 13 0.14 -1.72 0.09 0.22 * 0.31 13 0.30 0.45 13 0.12 -0.40 0.69 0.69
AF R ITG -0.48 11 0.14 0.14 11 0.67 -1.25 0.21 0.35 -0.46 11 0.15 0.07 11 0.84 -1.16 0.24 0.41
AF R TP NA 1 NA NA 1 NA NA NA NA NA 1 NA NA 1 NA NA NA NA
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
[1] “figures/pre-post_toolmaking_PCA_AF_R.png”
Table S10.G. Pre–post change: PCA components × SLF II/III left GM terminations (EXP)
PC thin (cross-sectional thinning)
PC long (elongation and pointedness)
pre-training
post-training
comparison
pre-training
post-training
comparison
variable r n p r n p Z p BH q r n p r n p Z p BH q
SLF L PMv -0.41 13 0.16 -0.06 13 0.83 -1.11 0.27 0.36 0.07 13 0.82 0.12 13 0.70 -0.11 0.91 0.91
SLF L BA44 0.15 13 0.62 0.58 13 0.04 -1.36 0.17 0.35 -0.29 13 0.34 0.36 13 0.23 -1.57 0.12 0.23 *
SLF L BA45 NA 1 NA NA 1 NA NA NA NA NA 1 NA NA 1 NA NA NA NA
SLF L SMG 0.03 13 0.93 0.73 13 0.00 -2.15 0.03 0.13 * -0.40 13 0.18 0.42 13 0.15 -1.91 0.06 0.22 *
SLF L AG -0.22 10 0.54 0.00 10 1.00 -0.47 0.64 0.64 -0.25 10 0.49 -0.14 10 0.70 -0.23 0.82 0.91
SLF L SPL NA 0 NA NA 0 NA NA NA NA NA 0 NA NA 0 NA NA NA NA
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).
[1] “figures/pre-post_toolmaking_PCA_SLF_L.png”
Table S10.H. Pre–post change: PCA components × SLF II/III right GM terminations (EXP)
PC thin (cross-sectional thinning)
PC long (elongation and pointedness)
pre-training
post-training
comparison
pre-training
post-training
comparison
variable r n p r n p Z p BH q r n p r n p Z p BH q
SLF R PMv -0.64 13 0.02 0.18 13 0.55 -2.48 0.01 0.06 * -0.28 13 0.35 0.30 13 0.31 -1.40 0.16 0.27
SLF R BA44 0.31 13 0.30 0.54 13 0.06 -0.78 0.44 0.44 0.36 13 0.22 0.35 13 0.25 0.04 0.97 0.97
SLF R BA45 NA 2 NA NA 2 NA NA NA NA NA 2 NA NA 2 NA NA NA NA
SLF R SMG -0.25 13 0.42 0.54 13 0.06 -1.95 0.05 0.13 * -0.29 13 0.33 0.41 13 0.16 -1.67 0.10 0.24 *
SLF R AG -0.35 13 0.24 0.39 13 0.18 -1.73 0.08 0.14 * -0.08 13 0.79 0.25 13 0.41 -0.76 0.45 0.56
SLF R SPL 0.00 8 1.00 0.69 8 0.06 -1.41 0.16 0.20 * -0.21 8 0.61 0.90 8 0.00 -2.77 0.01 0.03 *
Note:
Asterisk (*) marks BH-corrected results (q < 0.25).

[1] “figures/pre-post_toolmaking_PCA_SLF_R.png”

12 pre-post change in behavior

LS0tCnRpdGxlOiAiVGhlIHNhbWUgYnV0IGRpZmZlcmVudDogZXZpZGVuY2UgZm9yIHRoZSBjby1ldm9sdXRpb24gb2YgbGFuZ3VhZ2UgYW5kIHRvb2xtYWtpbmcgdGhyb3VnaCBuZXVyYWwgcmUtdXNlIgphdXRob3I6ICJTdWhhcyBWaWpheWFrdW1hciIKZGF0ZTogCgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDogCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2RlcHRoOiAzCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpCgppZiAoIXJlcXVpcmUoInBhY21hbiIpKSBpbnN0YWxsLnBhY2thZ2VzKCJwYWNtYW4iLCAicm1hcmtkb3duIikKcGFjbWFuOjpwX2xvYWQoImhlcmUiLCAicm1hcmtkb3duIikKYGBgCgpgYGB7ciBsb2FkX2RhdGFfYW5kX2Z1bmN0aW9uc30KaGVyZTo6aV9hbSgicmVzdWx0cy9yZXN1bHRzLlJtZCIpCnNvdXJjZShoZXJlKCJjb2RlL2xvYWRfZGVwZW5kZW5jaWVzLlIiKSkKc291cmNlKGhlcmUoImNvZGUvcHJlcHJvY2Vzc19kYXRhLlIiKSkKc291cmNlKGhlcmUoImNvZGUvYW5hbHlzaXNfZnVuY3Rpb25zLlIiKSkKc291cmNlKGhlcmUoImNvZGUvcGxvdHRpbmdfZnVuY3Rpb25zLlIiKSkKc291cmNlKGhlcmUoImNvZGUvdGFibGVfZnVuY3Rpb25zLlIiKSkKCmlmZWxzZSghZGlyLmV4aXN0cyhoZXJlKCJyZXN1bHRzIiwgImZpZ3VyZXMiKSksCiAgICAgICAgZGlyLmNyZWF0ZShoZXJlKCJyZXN1bHRzIiwgImZpZ3VyZXMiKSksCiAgICAgICAgIkZvdW5kIGRpcmVjdG9yeSBmb3IgZmlndXJlcywgY29udGludWluZyB3aXRob3V0IGNyZWF0aW5nLiIpCgppZmVsc2UoIWRpci5leGlzdHMoaGVyZSgicmVzdWx0cyIsICJSRGF0YSIpKSwKICAgICAgICBkaXIuY3JlYXRlKGhlcmUoInJlc3VsdHMiLCAiUkRhdGEiKSksCiAgICAgICAgIkZvdW5kIGRpcmVjdG9yeSBmb3IgcmVzdWx0cywgY29udGludWluZyB3aXRob3V0IGNyZWF0aW5nLiIpCmBgYAoKVXNlZnVsIGFiYnJldmlhdGlvbnM6IAoKLSBBRiAgICA9IEFyY3VhdGUgRmFzY2ljdWx1cyAKLSBTTEYgICA9IFN1cGVyaW9yIExvbmdpdHVkaW5hbCBGYXNjaWN1bHVzIChTTEYgSUkvSUlJKQotIFdNICAgID0gd2hpdGUgbWF0dGVyCi0gR00gICAgPSBncmF5IG1hdHRlcgotIEwgICAgID0gbGVmdCBoZW1pc3BoZXJlCi0gUiAgICAgPSByaWdodCBoZW1pc3BoZXJlCi0gQVEgICAgPSBBc3ltbWV0cnkgUXVvdGllbnQgCi0gUENBICAgPSBQcmluY2lwYWwgQ29tcG9uZW50IEFuYWx5c2lzIChQQ190aGluLCBQQ19sb25nIC0gZmlyc3QgdHdvIGNvbXBvbmVudHMgb2YgUENBKQoKUmVnaW9ucyBvZiBpbnRlcmVzdDogCi0gUE12ICAgPSB2ZW50cmFsIFByZW1vdG9yCi0gQkE0NCAgPSBCcm9kbWFubiBBcmVhIDQ0IChwYXJzIG9wZXJjdWxhcmlzKQotIEJBNDUgID0gQnJvZG1hbm4gQXJlYSA0NSAocGFycyB0cmlhbmd1bGFyaXMpCi0gU1RHICAgPSBTdXBlcmlvciBUZW1wb3JhbCBHeXJ1cwotIE1URyAgID0gTWlkZGxlIFRlbXBvcmFsIEd5cnVzCi0gSVRHICAgPSBJbmZlcmlvciBUZW1wb3JhbCBHeXJ1cwotIFRQICAgID0gVGVtcG9yYWwgcG9sZSAKLSBTUEwgICA9IFN1cGVyaW9yIFBhcmlldGFsIExvYnVsZQotIFNNRyAgID0gU3VwcmFtYXJnaW5hbCBHeXJ1cwotIEFHICAgID0gQW5ndWxhciBHeXJ1cwoKCiMgRGF0YSBkZXNjcmlwdGlvbiBhbmQgc3VtbWFyeSBzdGF0aXN0aWNzIAoKYGBge3IgdGFibGVfZGVtb2dyYXBoaWNzLCByZXN1bHRzPSdhc2lzJywgZXZhbD1UUlVFfQojIExvYWQgZGF0YSBmcm9tIHJvdyAyIG9ud2FyZDsgaGVhZGVyIG5hbWUgaXMgaGFyZC1jb2RlZCBmb3IgZGlzcGxheQpkZiA8LSByZWFkLmNzdigKICBoZXJlKCJkYXRhIiwgInBhcnRpY2lwYW50X2RlbW9ncmFwaGljcy5jc3YiKSwKICBza2lwID0gMSwKICBoZWFkZXIgPSBUUlVFLCBjaGVjay5uYW1lcyA9IEZBTFNFLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UKKQoKa2FibGUoCiAgZGYsCiAgY2FwdGlvbiA9ICIqKlRhYmxlIFMxLioqIFBhcnRpY2lwYW50IGRlbW9ncmFwaGljcy4iLAogIGFsaWduID0gImMiLCBib29rdGFicyA9IFRSVUUsIGZvcm1hdCA9ICJodG1sIgogICkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDQsICJGaW5lIG1vdG9yIGV4cGVyaWVuY2UiID0gMywgIkdyb3NzIG1vdG9yIGV4cGVyaWVuY2UiID0gMywgIiAiID0gMiksIGJvbGQgPSBUUlVFLCBsaW5lID0gVFJVRSkgJT4lCiAga2FibGVfc3R5bGluZygKICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLAogICAgZnVsbF93aWR0aCA9IFRSVUUsIHBvc2l0aW9uID0gImNlbnRlciIpICU+JQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiVGhlIHNraWxsIHdpdGggdGhlIGdyZWF0ZXN0IG51bWJlciBvZiB5ZWFycyBvZiBleHBlcmllbmNlIGlzIHNob3cgKGFuZCBjb25zaWRlcmVkIGZvciBhbmFseXNlcykuIikKCnJtKGRmKQoKYGBgCgoKYGBge3IgZGVzY3JpcHRpdmVfc3RhdHMsIHJlc3VsdHM9J2FzaXMnLCBldmFsPVRSVUV9CiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgREVTQ1JJUFRJVkUgU1RBVElTVElDUzogYmVoYXZpb3JhbCBtZWFzdXJlcwojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIHByZS10cmFpbmluZyAoYmVoYXZpb3JhbCwgIGluIGFsbCBwYXJ0aWNpcGFudHMpCmRmIDwtIGRhdGEgJT4lCiAgZmlsdGVyKHRyYWluaW5nID09ICJwcmUiKSAlPiUKICBzZWxlY3QoYWdlLCBncm9zc19tb3Rvcl9leHBlcmllbmNlLCBmaW5lX21vdG9yX2V4cGVyaWVuY2UsIHRvb2xtYWtpbmdfcGVyZm9ybWFuY2UsIFBDX3RoaW4sIFBDX2xvbmcsIHN5bnRhY3RpY19jb21wbGV4aXR5LCBBR0xfZF9ncmFtbWF0aWNhbGl0eSwgQUdMX2RfY2h1bmtfc3RyZW5ndGgpIAoKZGVzY3JpcHRpdmVfc3RhdHNfYmVoYXZpb3JfUFJFX3RyYWluaW5nIDwtIHBzeWNoOjpkZXNjcmliZShkZikKCmRlc2NyaXB0aXZlX3N0YXRzX2JlaGF2aW9yX1BSRV90cmFpbmluZyA8LSBkZXNjcmlwdGl2ZV9zdGF0c19iZWhhdmlvcl9QUkVfdHJhaW5pbmcgJT4lCiAgc2VsZWN0KG4sIG1lYW4sIHNkLCBzZSwgbWluLCBtYXgsIHJhbmdlLCBza2V3KSAlPiUKICAgIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH4gcm91bmQoLiwgMikpKQoKa2FibGUoZGVzY3JpcHRpdmVfc3RhdHNfYmVoYXZpb3JfUFJFX3RyYWluaW5nLCAKICAgICAgY2FwdGlvbiA9ICIqKlRhYmxlIFMyLiBBKiogRGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgYmVoYXZpb3JhbCBtZWFzdXJlcyAocHJlLXRyYWluaW5nOyBhbGwgcGFydGljaXBhbnRzKS4iLCAKICAgICAgYm9va3RhYnMgPSBUUlVFKSAlPiUgCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgCiAgICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gVFJVRSwgcG9zaXRpb24gPSAiY2VudGVyIikgJT4lIAogIGZvb3Rub3RlKGdlbmVyYWwgPSAiQUdMID0gQXJ0aWZpY2lhbCBHcmFtbWFyIExlYXJuaW5nLCBuID0gbnVtYmVyIG9mIHNhbXBsZXMsIFNEID0gc3RhbmRhcmQgZGV2aWF0aW9uLCBTRSA9IHN0YW5kYXJkIGVycm9yIG9mIHRoZSBtZWFuIikKCnJtKGRmKQpgYGAKCgpgYGB7ciBkZXNjcmlwdGl2ZV9zdGF0c19wb3N0LCByZXN1bHRzPSdhc2lzJywgZXZhbD1UUlVFfQojIHBvc3QtdHJhaW5pbmcgKGJlaGF2aW9yYWwsICBpbiBleHBlcmltZW50YWwgZ3JvdXAgb25seSkKZGYgPC0gZGF0YSAlPiUKICBmaWx0ZXIodHJhaW5pbmcgPT0gInBvc3QiKSAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gImV4cCIpICU+JQogIHNlbGVjdCh0b29sbWFraW5nX3BlcmZvcm1hbmNlLCBQQ190aGluLCBQQ19sb25nLCBzeW50YWN0aWNfY29tcGxleGl0eSkKCmRlc2NyaXB0aXZlX3N0YXRzX2JlaGF2aW9yX1BPU1RfdHJhaW5pbmcgPC0gcHN5Y2g6OmRlc2NyaWJlKGRmKSAKCmRlc2NyaXB0aXZlX3N0YXRzX2JlaGF2aW9yX1BPU1RfdHJhaW5pbmcgPC0gZGVzY3JpcHRpdmVfc3RhdHNfYmVoYXZpb3JfUE9TVF90cmFpbmluZyAlPiUKICBzZWxlY3QobiwgbWVhbiwgc2QsIHNlLCBtaW4sIG1heCwgcmFuZ2UsIHNrZXcpICU+JQogICAgbXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfiByb3VuZCguLCAyKSkpCgprYWJsZShkZXNjcmlwdGl2ZV9zdGF0c19iZWhhdmlvcl9QT1NUX3RyYWluaW5nLCAKICAgICAgY2FwdGlvbiA9ICIqKlRhYmxlIFMyLiBCKiogRGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgYmVoYXZpb3JhbCBtZWFzdXJlcyAocG9zdC10cmFpbmluZzsgZXhwIGdyb3VwKS4iLCAKICAgICAgYm9va3RhYnMgPSBUUlVFKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCAKICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBUUlVFLCBwb3NpdGlvbiA9ICJjZW50ZXIiKQoKCnJtKGRmKQpgYGAKCiMgVHJhY3RvZ3JhcGh5IHJlc3VsdHMKCiMjIEFyY3VhdGUgRmFzY2ljdWx1cwoKIyMjIFRyYWN0b2dyYXBoeSByZXN1bHQKYGBge3IgcmVzdWx0c19BRl90cmFjdF9ST0ksIGV2YWw9VFJVRX0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgicmVzdWx0cyIsICJpbXBvcnQiLCAiV01fUk9JX0FGLnBuZyIpKQpgYGAKCiMjIyBXaGl0ZSBtYXR0ZXIgbWVhc3VyZXM6IGF2ZXJhZ2UgRkEsIFdNIHRyYWN0IHZvbHVtZSAKYGBge3IgcmVzdWx0c19BRl9XTSwgZXZhbD1UUlVFfQojIyMgVHJhY3RvZ3JhcGh5IHJlc3VsdApkZiA8LSBkYXRhICU+JQogIGZpbHRlcih0cmFpbmluZyA9PSAicHJlIikgJT4lCiAgc2VsZWN0KEFGX0xfYXZlcmFnZUZBLCBBRl9SX2F2ZXJhZ2VGQSwgQUZfTF92b2x1bWVXTSwgQUZfUl92b2x1bWVXTSkKCkFGX2F2ZXJhZ2VGQV9wbG90IDwtIHBsb3Rfd21fbWVhc3VyZXMoCiAgICBkZiA9IGRmLAogICAgdmFycyA9IGMoIkFGX0xfYXZlcmFnZUZBIiwiQUZfUl9hdmVyYWdlRkEiKSwKICAgIHlsYWIgPSAiQXZlcmFnZSBGQSIsCiAgICB0aXRsZSA9ICJBRjogYXZlcmFnZSBGQSIsCiAgICBmaWxsID0gY29sb3IkQUYsCiAgICB5bGltID0gYygwLjMsIDAuNSksCiAgICBzaXplID0gMTUKKQoKQUZfdm9sdW1lV01fcGxvdCA8LSBwbG90X3dtX21lYXN1cmVzKAogIGRmID0gZGYsCiAgdmFycyA9IGMoIkFGX0xfdm9sdW1lV00iLCJBRl9SX3ZvbHVtZVdNIiksCiAgeWxhYiA9IGV4cHJlc3Npb24ocGFzdGUoIlZvbHVtZSAobW0iXjMsICIpIikpLAogIHRpdGxlID0gIkFGOiB2b2x1bWUgV00iLAogIGZpbGwgPSBjb2xvciRBRiwKICB5bGltID0gYygwLCAyMDAwMCksIAogIHNpemUgPSAxNQopCnJtKGRmKQoKZ2dwdWJyOjpnZ2FycmFuZ2UoQUZfYXZlcmFnZUZBX3Bsb3QsIEFGX3ZvbHVtZVdNX3Bsb3QsIG5yb3cgPSAxKQpgYGAKCiMjIyBHcmF5IG1hdHRlciBtZWFzdXJlOiB0ZXJtaW5hdGlvbiB2b2x1bWUKYGBge3IgcmVzdWx0c19BRl9HTSwgZXZhbD1UUlVFfQpkZiA8LSBkYXRhICU+JQogIGZpbHRlcih0cmFpbmluZyA9PSAicHJlIikgJT4lCiAgc2VsZWN0KGFsbF9vZihjKHZhciRBRl9MX0dNX3Rlcm1pbmF0aW9ucywgdmFyJEFGX1JfR01fdGVybWluYXRpb25zKSkpCgojIFBsb3QKQUZfR01fcGxvdCA8LSBwbG90X2dtX3Rlcm1pbmF0aW9ucygKICBkYXRhX3ByZSAgID0gZGYsCiAgbGVmdF9jb2xzICA9IHZhciRBRl9MX0dNX3Rlcm1pbmF0aW9ucywKICByaWdodF9jb2xzID0gdmFyJEFGX1JfR01fdGVybWluYXRpb25zLAogIHJvaV9sYWJlbHMgPSByb2lfb3JkZXIkQUYsCiAgdGl0bGUgICAgICA9ICJHTSB0ZXJtaW5hdGlvbiB2b2x1bWUgb2YgQUYiLAogIGZpbGxfTCAgICAgPSBjb2xvciRwcmUkQUZfTCwKICBmaWxsX1IgICAgID0gY29sb3IkcHJlJEFGX1IsCiAgYmFzZV9zaXplICA9IDE1CikKQUZfR01fcGxvdAoKcm0oZGYpCgpgYGAKCiMjIyBBc3ltbWV0cnkgUXVvdGllbnRzCmBgYHtyIHBsb3RfQUZfQVEsIGV2YWw9VFJVRX0KZGYgPC0gZGF0YSAlPiUgZmlsdGVyKHRyYWluaW5nID09ICJwcmUiKQoKIyBBRiBXTSAoMiBtZWFzdXJlcykKYWZfd21fdmFycyAgIDwtIGMoIkFRX0FGX2F2ZXJhZ2VGQSIsICJBUV9BRl92b2x1bWVXTSIpCmFmX3dtX2xhYmVscyA8LSBjKCJhdmVyYWdlIEZBIiwgIldNIHZvbHVtZSIpCgphZl93bV9sb25nIDwtIHBpdm90X0FRX2xvbmcoZGYsIGFmX3dtX3ZhcnMsIGFmX3dtX2xhYmVscywgb3V0X25hbWUgPSAibWVhc3VyZSIpCgpBRl9XTV9wbG90IDwtIHBsb3RfQVEoCiAgZGZsb25nICA9IGFmX3dtX2xvbmcsCiAgeF92YXIgICA9ICJtZWFzdXJlIiwKICB0aXRsZSAgID0gIkFRIG9mIEFGIHRyYWN0IG1ldHJpY3MiLAogIGZpbGxfY29sb3I9IGNvbG9yJEFGLAogIHlfbGltICAgPSBjKC0yLjEsIDIuMSkKKQoKIyBBRiBHTSAoNyBST0lzKQphZl9nbV92YXJzICAgPC0gdmFyJEFRX0FGX0dNX3Rlcm1pbmF0aW9ucwphZl9nbV9sYWJlbHMgPC0gcm9pX29yZGVyJEFGCgphZl9nbV9sb25nIDwtIHBpdm90X0FRX2xvbmcoZGYsIGFmX2dtX3ZhcnMsIGFmX2dtX2xhYmVscywgb3V0X25hbWUgPSAicm9pIikKCkFGX0dNX3Bsb3QgPC0gcGxvdF9BUSgKICBkZmxvbmcgID0gYWZfZ21fbG9uZywKICB4X3ZhciAgID0gInJvaSIsCiAgdGl0bGUgICA9ICJBUSBvZiBBRiB0ZXJtaW5hdGlvbnMgaW4gR00iLAogIGZpbGxfY29sb3I9IGNvbG9yJEFGLAogIHlfbGltICAgPSBjKC0yLjEsIDIuMSkKKQoKIyBTdGFjayBwbG90cwpBUV9BRl9maWd1cmUgPC0gc3RhY2tfdHdvKEFGX1dNX3Bsb3QsIEFGX0dNX3Bsb3QsIHRvcF9uID0gMSwgYm90X24gPSAxLCByYXRpbyA9IDIuNSkKQVFfQUZfZmlndXJlCgpybShkZikKYGBgCgojIyBTdXBlcmlvciBMb25naXR1ZGluYWwgRmFzY2ljdWx1cyAgKFNMRiBJSS9JSUkpCgojIyMgVHJhY3RvZ3JhcGh5IHJlc3VsdApgYGB7ciByZXN1bHRzX1NMRl90cmFjdF9ST0ksIGV2YWw9VFJVRX0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgicmVzdWx0cyIsICJpbXBvcnQiLCAiV01fUk9JX1NMRi5wbmciKSkKYGBgCgojIyMgV2hpdGUgbWF0dGVyIG1lYXN1cmVzOiBhdmVyYWdlIEZBLCBXTSB0cmFjdCB2b2x1bWUgCmBgYHtyIHJlc3VsdHNfU0xGX1dNLCBldmFsPVRSVUV9CmRmIDwtIGRhdGEgJT4lCiAgZmlsdGVyKHRyYWluaW5nID09ICJwcmUiKSAlPiUKICBzZWxlY3QoU0xGX0xfYXZlcmFnZUZBLCBTTEZfUl9hdmVyYWdlRkEsIFNMRl9MX3ZvbHVtZVdNLCBTTEZfUl92b2x1bWVXTSkKClNMRl9hdmVyYWdlRkFfcGxvdCA8LSBwbG90X3dtX21lYXN1cmVzKAogICAgZGYgPSBkZiwKICAgIHZhcnMgPSBjKCJTTEZfTF9hdmVyYWdlRkEiLCJTTEZfUl9hdmVyYWdlRkEiKSwKICAgIHlsYWIgPSAiQXZlcmFnZSBGQSIsCiAgICB0aXRsZSA9ICJTTEYgSUkvSUlJOiBhdmVyYWdlIEZBIiwKICAgIGZpbGwgPSBjb2xvciRTTEYsCiAgICB5bGltID0gYygwLjMsIDAuNSksCiAgICBzaXplID0gMTUKKQoKU0xGX3ZvbHVtZVdNX3Bsb3QgPC0gcGxvdF93bV9tZWFzdXJlcygKICBkZiA9IGRmLAogIHZhcnMgPSBjKCJTTEZfTF92b2x1bWVXTSIsIlNMRl9SX3ZvbHVtZVdNIiksCiAgeWxhYiA9IGV4cHJlc3Npb24ocGFzdGUoIlZvbHVtZSAobW0iXjMsICIpIikpLAogIHRpdGxlID0gIlNMRiBJSS9JSUk6IHZvbHVtZSBXTSIsCiAgZmlsbCA9IGNvbG9yJFNMRiwKICB5bGltID0gYygwLCAyMDAwMCksIAogIHNpemUgPSAxNQopCgpnZ3B1YnI6OmdnYXJyYW5nZShTTEZfYXZlcmFnZUZBX3Bsb3QsIFNMRl92b2x1bWVXTV9wbG90LCBucm93ID0gMSkKCnJtKGRmKQpgYGAKCiMjIyBHcmF5IG1hdHRlciBtZWFzdXJlOiB0ZXJtaW5hdGlvbiB2b2x1bWUKYGBge3IgcmVzdWx0c19TTEZfR00sIGV2YWw9VFJVRX0KZGYgPC0gZGF0YSAlPiUKICBmaWx0ZXIodHJhaW5pbmcgPT0gInByZSIpICU+JQogIHNlbGVjdChhbGxfb2YoYyh2YXIkU0xGX0xfR01fdGVybWluYXRpb25zLCB2YXIkU0xGX1JfR01fdGVybWluYXRpb25zKSkpCgojIFBsb3QKU0xGX0dNX3Bsb3QgPC0gcGxvdF9nbV90ZXJtaW5hdGlvbnMoCiAgZGF0YV9wcmUgICA9IGRmLAogIGxlZnRfY29scyAgPSB2YXIkU0xGX0xfR01fdGVybWluYXRpb25zLAogIHJpZ2h0X2NvbHMgPSB2YXIkU0xGX1JfR01fdGVybWluYXRpb25zLAogIHJvaV9sYWJlbHMgPSByb2lfb3JkZXIkU0xGLAogIHRpdGxlICAgICAgPSAiR00gdGVybWluYXRpb25zIG9mIFNMRiBJSS9JSUkiLAogIGZpbGxfTCAgICAgPSBjb2xvciRwcmUkU0xGX0wsCiAgZmlsbF9SICAgICA9IGNvbG9yJHByZSRTTEZfUiwKICBiYXNlX3NpemUgID0gMTUKKQpTTEZfR01fcGxvdAoKcm0oZGYpCmBgYAoKIyMjIEFzeW1tZXRyeSBRdW90aWVudHMKYGBge3IgcGxvdF9TTEZfQVEsIGV2YWw9VFJVRX0KZGYgPC0gZGF0YSAlPiUgZmlsdGVyKHRyYWluaW5nID09ICJwcmUiKQoKIyBTTEYgV00gKDIgbWVhc3VyZXMpCnNsZl93bV92YXJzICAgPC0gYygiQVFfU0xGX2F2ZXJhZ2VGQSIsICJBUV9TTEZfdm9sdW1lV00iKQpzbGZfd21fbGFiZWxzIDwtIGMoImF2ZXJhZ2UgRkEiLCAiV00gdm9sdW1lIikKCnNsZl93bV9sb25nIDwtIHBpdm90X0FRX2xvbmcoZGYsIHNsZl93bV92YXJzLCBzbGZfd21fbGFiZWxzLCBvdXRfbmFtZSA9ICJtZWFzdXJlIikKClNMRl9XTV9wbG90IDwtIHBsb3RfQVEoCiAgZGZsb25nICA9IHNsZl93bV9sb25nLAogIHhfdmFyICAgPSAibWVhc3VyZSIsCiAgdGl0bGUgICA9ICJBUSBvZiBTTEYgSUkvSUlJIHRyYWN0IG1ldHJpY3MiLAogIGZpbGxfY29sb3I9IGNvbG9yJFNMRiwKICB5X2xpbSAgID0gYygtMi4xLCAyLjEpCikKCiMgU0xGIEdNICg2IFJPSXMpCnNsZl9nbV92YXJzICAgPC0gdmFyJEFRX1NMRl9HTV90ZXJtaW5hdGlvbnMKc2xmX2dtX2xhYmVscyA8LSByb2lfb3JkZXIkU0xGCgpzbGZfZ21fbG9uZyA8LSBwaXZvdF9BUV9sb25nKGRmLCBzbGZfZ21fdmFycywgc2xmX2dtX2xhYmVscywgb3V0X25hbWUgPSAicm9pIikKClNMRl9HTV9wbG90IDwtIHBsb3RfQVEoCiAgZGZsb25nICA9IHNsZl9nbV9sb25nLAogIHhfdmFyICAgPSAicm9pIiwKICB0aXRsZSAgID0gIkFRIG9mIFNMRiBJSS9JSUkgdGVybWluYXRpb25zIGluIEdNIiwKICBmaWxsX2NvbG9yPSBjb2xvciRTTEYsCiAgeV9saW0gICA9IGMoLTIuMSwgMi4xKQopCgojIFN0YWNrIHBsb3RzCkFRX1NMRl9maWd1cmUgPC0gc3RhY2tfdHdvKFNMRl9XTV9wbG90LCBTTEZfR01fcGxvdCwgdG9wX24gPSAxLCBib3RfbiA9IDEsIHJhdGlvID0gMi41KQpBUV9TTEZfZmlndXJlCgpybShkZikKCmBgYAoKIyBWaXN1YWxpemUgY29ycmVsYXRpb24gYmV0d2VlbiBiZWhhdmlvcmFsIHZhcmlhYmxlcyAKYGBge3IgcGxvdF9iZWhhdmlvcmFsX3ZhcmlhYmxlc19pbl9wYW5lbF9wbG90LCBvdXQud2lkdGg9IjEwMCUiLCBldmFsPVRSVUV9CmRmIDwtIGRhdGEgJT4lCiAgZmlsdGVyKHRyYWluaW5nID09ICJwcmUiKSAlPiUKICBzZWxlY3QoYWdlLCBncm9zc19tb3Rvcl9leHBlcmllbmNlLCBmaW5lX21vdG9yX2V4cGVyaWVuY2UsIAogICAgICAgICB0b29sbWFraW5nX3BlcmZvcm1hbmNlLCBQQ190aGluLCBQQ19sb25nLCAKICAgICAgICAgc3ludGFjdGljX2NvbXBsZXhpdHksIEFHTF9kX2dyYW1tYXRpY2FsaXR5LCBBR0xfZF9jaHVua19zdHJlbmd0aCkgJT4lCiAgZmlsdGVyKGNvbXBsZXRlLmNhc2VzKC4pKSAKCmxlZ2libGVfbmFtZXMgPC0gYygKICBhZ2UgICAgICAgICAgICAgICAgICAgID0gIkFnZSIsCiAgZ3Jvc3NfbW90b3JfZXhwZXJpZW5jZSA9ICJHcm9zcyBtb3RvclxuRXhwZXJpZW5jZSIsCiAgZmluZV9tb3Rvcl9leHBlcmllbmNlICA9ICJGaW5lIG1vdG9yXG5FeHBlcmllbmNlIiwKICB0b29sbWFraW5nX3BlcmZvcm1hbmNlID0gIlRvb2xtYWtpbmdcblBlcmZvcm1hbmNlIiwKICBQQ190aGluICAgICAgICAgICAgICAgID0gIlBDIHRoaW4iLAogIFBDX2xvbmcgICAgICAgICAgICAgICAgPSAiUEMgbG9uZyIsCiAgc3ludGFjdGljX2NvbXBsZXhpdHkgICA9ICJTeW50YWN0aWNcbkNvbXBsZXhpdHkiLAogIEFHTF9kX2dyYW1tYXRpY2FsaXR5ICAgPSAiQUdMIGQnXG5HcmFtbWF0aWNhbGl0eSIsCiAgQUdMX2RfY2h1bmtfc3RyZW5ndGggICA9ICJBR0wgZCdcbkNodW5rIHN0cmVuZ3RoIgopCgpuYW1lcyhkZikgPC0gdW5uYW1lKGxlZ2libGVfbmFtZXNbbmFtZXMoZGYpXSkgICMgcmVuYW1lIGNvbHVtbnMgZm9yIGxlZ2liaWxpdHkKCmdncGFpcnMoCiAgZGYsCiAgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBtZXRob2QgPSAicGVhcnNvbiIsIHNpemUgPSAzKSksCiAgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJzbW9vdGgiLCBtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBhbHBoYSA9IDAuNiwgc2l6ZSA9IDAuMykpLAogIGRpYWcgID0gbGlzdChjb250aW51b3VzID0gImRlbnNpdHlEaWFnIiksCiAgdGl0bGUgPSAiUGVhcnNvbidzIGNvcnJlbGF0aW9uOiBiZWhhdmlvcmFsIG1lYXN1cmVzIChwcmUtdHJhaW5pbmcpIgopCgpybShkZikKCmBgYAoKIyBMYXRlcmFsaXphdGlvbiBvZiBicmFpbiBtZWFzdXJlcwpgYGB7ciBicmFpbl9hc3ltbWV0cnksIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0KIyBzdGF0czogZm9yIEFRIC0gQUYgYW5kIFNMRiBXTSBtZWFzdXJlcyAKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGYgPC0gZGF0YSAlPiUgZmlsdGVyKHRyYWluaW5nID09ICdwcmUnKSAKCmRmIDwtIGRmWyx2YXIkQVFfV01fbWVhc3VyZXNdCgpyZXN1bHRfZGY8LWNoZWNrX25vcm1hbGl0eV9hbmRfdGVzdChkZikKCiMgQ29tcHV0ZSBCSC1hZGp1c3RlZCBwLXZhbHVlcwpyZXN1bHRfZGYkYWRqX3FfdmFsdWUgPC0gcC5hZGp1c3QocmVzdWx0X2RmJHBfdmFsdWUsIG1ldGhvZCA9ICJCSCIpCgojIEFkZCBzdGFyIGZvciBxIDwgMC4yNQpyZXN1bHRfZGYkYWRqX3FfdmFsdWUgPC0gaWZlbHNlKAogIGlzLm5hKHJlc3VsdF9kZiRhZGpfcV92YWx1ZSksCiAgTkEsCiAgaWZlbHNlKHJlc3VsdF9kZiRhZGpfcV92YWx1ZSA8IDAuMjUsCiAgICAgICAgIHBhc3RlMChzcHJpbnRmKCIlLjNmIiwgcmVzdWx0X2RmJGFkal9xX3ZhbHVlKSwgIiAqIiksCiAgICAgICAgIHNwcmludGYoIiUuM2YiLCByZXN1bHRfZGYkYWRqX3FfdmFsdWUpKQopCgpyZXN1bHRfZGY8LXVuZGVyc2NvcmVfdG9fc3BhY2UocmVzdWx0X2RmKQoKa2FibGUocmVzdWx0X2RmLCBkaWdpdHMgPSAzLAogICAgICBmb3JtYXQgPSAiaHRtbCIsCiAgICAgIGVzY2FwZSA9IEZBTFNFLAogICAgICBhbGlnbiA9IGMoImwiLCJjIiwiYyIsImMiLCJjIiwiYyIsImMiLCJsIiksCiAgICAgIGNvbC5uYW1lcyA9IGMoIlZhcmlhYmxlIiwgIm4iLCAiVyIsICJwLXZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAiVGVzdCIsICJTdGF0aXN0aWMiLCAicC12YWx1ZSIsICJCSCBxLXZhbHVlIiksCiAgICAgIGNhcHRpb24gPSAiKipUYWJsZSBTMyBBLioqIEFzeW1tZXRyeSBvZiBBRiBhbmQgU0xGIElJL0lJSSB3aGl0ZSBtYXR0ZXIgdHJhY3QgbWVhc3VyZXMuIikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsICJub3JtYWxpdHkiID0gMiwgInNpZ25pZmljYW5jZSB0ZXN0IiA9IDQpLCBib2xkID0gVFJVRSkgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoImhvdmVyIiwgInJlc3BvbnNpdmUiLCAiY29uZGVuc2VkIikpICU+JQogIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IFRSVUUpCgpybShkZiwgcmVzdWx0X2RmKQoKIyBEbyB0aGUgc2FtZSBmb3IgQVEgb2YgQUYgR00gdGVybWluYXRpb25zIApkZiA8LSBkYXRhICU+JSBmaWx0ZXIodHJhaW5pbmcgPT0gJ3ByZScpIAoKZGYgPC0gZGZbLHZhciRBUV9BRl9HTV90ZXJtaW5hdGlvbnNdCgpyZXN1bHRfZGY8LWNoZWNrX25vcm1hbGl0eV9hbmRfdGVzdChkZikKCiMgQ29tcHV0ZSBCSC1hZGp1c3RlZCBwLXZhbHVlcwpyZXN1bHRfZGYkYWRqX3FfdmFsdWUgPC0gcC5hZGp1c3QocmVzdWx0X2RmJHBfdmFsdWUsIG1ldGhvZCA9ICJCSCIpCgojIEFkZCBzdGFyIGZvciBxIDwgMC4yNQpyZXN1bHRfZGYkYWRqX3FfdmFsdWUgPC0gaWZlbHNlKAogIGlzLm5hKHJlc3VsdF9kZiRhZGpfcV92YWx1ZSksCiAgTkEsCiAgaWZlbHNlKHJlc3VsdF9kZiRhZGpfcV92YWx1ZSA8IDAuMjUsCiAgICAgICAgIHBhc3RlMChzcHJpbnRmKCIlLjNmIiwgcmVzdWx0X2RmJGFkal9xX3ZhbHVlKSwgIiAqIiksCiAgICAgICAgIHNwcmludGYoIiUuM2YiLCByZXN1bHRfZGYkYWRqX3FfdmFsdWUpKQopCgpyZXN1bHRfZGY8LXVuZGVyc2NvcmVfdG9fc3BhY2UocmVzdWx0X2RmKQoKa2FibGUocmVzdWx0X2RmLCBkaWdpdHMgPSAzLAogICAgICBmb3JtYXQgPSAiaHRtbCIsCiAgICAgIGVzY2FwZSA9IEZBTFNFLAogICAgICBhbGlnbiA9IGMoImwiLCJjIiwiYyIsImMiLCJjIiwiYyIsImMiLCJsIiksCiAgICAgIGNvbC5uYW1lcyA9IGMoIlZhcmlhYmxlIiwgIm4iLCAiVyIsICJwLXZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAiVGVzdCIsICJTdGF0aXN0aWMiLCAicC12YWx1ZSIsICJCSCBxLXZhbHVlIiksCiAgICAgIGNhcHRpb24gPSAiKipUYWJsZSBTMyBCLioqIEFzeW1tZXRyeSBvZiBBRiBHTSB0ZW1yaW5hdGlvbnMuIikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsICJub3JtYWxpdHkiID0gMiwgInNpZ25pZmljYW5jZSB0ZXN0IiA9IDQpLCBib2xkID0gVFJVRSkgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoImhvdmVyIiwgInJlc3BvbnNpdmUiLCAiY29uZGVuc2VkIikpICU+JQogIGthYmxlX2NsYXNzaWMoZnVsbF93aWR0aCA9IFRSVUUpCgpybShkZiwgcmVzdWx0X2RmKQoKIyBEbyB0aGUgc2FtZSBmb3IgQVEgb2YgU0xGIElJL0lJSSBHTSB0ZXJtaW5hdGlvbnMgCmRmIDwtIGRhdGEgJT4lIGZpbHRlcih0cmFpbmluZyA9PSAncHJlJykgCgpkZiA8LSBkZlssdmFyJEFRX1NMRl9HTV90ZXJtaW5hdGlvbnNdCgpyZXN1bHRfZGY8LWNoZWNrX25vcm1hbGl0eV9hbmRfdGVzdChkZikKCiMgQ29tcHV0ZSBCSC1hZGp1c3RlZCBwLXZhbHVlcwpyZXN1bHRfZGYkYWRqX3FfdmFsdWUgPC0gcC5hZGp1c3QocmVzdWx0X2RmJHBfdmFsdWUsIG1ldGhvZCA9ICJCSCIpCgojIEFkZCBzdGFyIGZvciBxIDwgMC4yNQpyZXN1bHRfZGYkYWRqX3FfdmFsdWUgPC0gaWZlbHNlKAogIGlzLm5hKHJlc3VsdF9kZiRhZGpfcV92YWx1ZSksCiAgTkEsCiAgaWZlbHNlKHJlc3VsdF9kZiRhZGpfcV92YWx1ZSA8IDAuMjUsCiAgICAgICAgIHBhc3RlMChzcHJpbnRmKCIlLjNmIiwgcmVzdWx0X2RmJGFkal9xX3ZhbHVlKSwgIiAqIiksCiAgICAgICAgIHNwcmludGYoIiUuM2YiLCByZXN1bHRfZGYkYWRqX3FfdmFsdWUpKQopCgpyZXN1bHRfZGY8LXVuZGVyc2NvcmVfdG9fc3BhY2UocmVzdWx0X2RmKQoKa2FibGUocmVzdWx0X2RmLCBkaWdpdHMgPSAzLAogICAgICBmb3JtYXQgPSAiaHRtbCIsCiAgICAgIGVzY2FwZSA9IEZBTFNFLAogICAgICBhbGlnbiA9IGMoImwiLCJjIiwiYyIsImMiLCJjIiwiYyIsImMiLCJsIiksCiAgICAgIGNvbC5uYW1lcyA9IGMoIlZhcmlhYmxlIiwgIm4iLCAiVyIsICJwLXZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAiVGVzdCIsICJTdGF0aXN0aWMiLCAicC12YWx1ZSIsICJCSCBxLXZhbHVlIiksCiAgICAgIGNhcHRpb24gPSAiKipUYWJsZSBTMyBDLioqIEFzeW1tZXRyeSBvZiBTTEYgSUkvSUlJIEdNIHRlcm1pbmF0aW9ucy4iKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwgIm5vcm1hbGl0eSIgPSAyLCAic2lnbmlmaWNhbmNlIHRlc3QiID0gNCksIGJvbGQgPSBUUlVFKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkgJT4lCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gVFJVRSkKCnJtKGRmLCByZXN1bHRfZGYpCgpgYGAKCiMgSW5mbHVlbmNlIG9mIHByaW9yIGV4cGVyaWVuY2Ugb24gdG9vbG1ha2luZyBwZXJmb3JtYW5jZSAocHJlLXRyYWluaW5nKQoKIyMgRWZmZWN0IG9mIG1vdG9yLXNraWxsIGV4cGVyaWVuY2UKYGBge3IgdG9vbG1ha2luZ19wcmVkaWN0b3JzX21vdG9yX2V4cGVyaWVuY2UsIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0KZGYgPC0gZGF0YSAlPiUKICBmaWx0ZXIodHJhaW5pbmcgPT0gInByZSIpICU+JQogIG11dGF0ZShncm91cCA9IGZhY3Rvcihncm91cCwgbGV2ZWxzID0gYygiY29uIiwgImV4cCIpKSkKCiMgVmFyaWFibGVzIHVzZWQgZm9yIHRoaXMgYW5hbHlzaXMKc2VsZWN0X3ZhcmlhYmxlcyA8LSBjKCJncm91cCIsCiAgICAgICAgICAgICAgICAgICAgICAidG9vbG1ha2luZ19wZXJmb3JtYW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAiZ3Jvc3NfbW90b3JfZXhwZXJpZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAiZmluZV9tb3Rvcl9leHBlcmllbmNlIikKCmRmIDwtIGRmICU+JQogIHNlbGVjdChhbGxfb2Yoc2VsZWN0X3ZhcmlhYmxlcykpICU+JQogIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkKCiMgQmFzZWxpbmUgbW90b3Igc2tpbGwgZXhwZXJpZW5jZSBtb2RlbApsbV90b29sbWFraW5nX21vdG9yX2V4cGVyaWVuY2UgPC0gbG0odG9vbG1ha2luZ19wZXJmb3JtYW5jZSB+IGdyb3NzX21vdG9yX2V4cGVyaWVuY2UgKyBmaW5lX21vdG9yX2V4cGVyaWVuY2UsCiAgICAgICAgICAgICAgZGF0YSA9IGRmKQoKY2hlY2tfbW9kZWwobG1fdG9vbG1ha2luZ19tb3Rvcl9leHBlcmllbmNlKQoKc3VtbWFyeShsbV90b29sbWFraW5nX21vdG9yX2V4cGVyaWVuY2UpCgojIExvbmcgZm9ybWF0IGZvciBmYWNldGluZwpkZl9sb25nIDwtIGRmICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBjKGdyb3NzX21vdG9yX2V4cGVyaWVuY2UsIGZpbmVfbW90b3JfZXhwZXJpZW5jZSksCiAgICBuYW1lc190byA9ICJwcmVkaWN0b3IiLAogICAgdmFsdWVzX3RvID0gImV4cGVyaWVuY2UiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBwcmVkaWN0b3IgPSBmYWN0b3IoCiAgICAgIHByZWRpY3RvciwKICAgICAgbGV2ZWxzID0gYygiZ3Jvc3NfbW90b3JfZXhwZXJpZW5jZSIsICJmaW5lX21vdG9yX2V4cGVyaWVuY2UiKSwKICAgICAgbGFiZWxzID0gYygiZ3Jvc3MgbW90b3IgZXhwICh5ZWFycykiLAogICAgICAgICAgICAgICAgICJmaW5lIG1vdG9yIGV4cCAoeWVhcnMpIikKICAgICkKICApCgojIEZhY2V0ZWQgcGxvdCAobm8gZ3JvdXAgc2VwYXJhdGlvbikKZ2dwbG90KGRmX2xvbmcsCiAgICAgICBhZXMoeCA9IGV4cGVyaWVuY2UsCiAgICAgICAgICAgeSA9IHRvb2xtYWtpbmdfcGVyZm9ybWFuY2UpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWxwaGEgPSAuOCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSwgY29sb3IgPSAiYmxhY2siKSArCiAgZmFjZXRfd3JhcCh+IHByZWRpY3RvciwgbnJvdyA9IDEsIHNjYWxlcyA9ICJmcmVlX3giKSArCiAgbGFicyh4ID0gTlVMTCwKICAgICAgIHkgPSAidG9vbG1ha2luZyBwZXJmb3JtYW5jZSIpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDE0KQoKIyBMZXZlbmUncyB0ZXN0IChmb3IgdmFyaWFuY2UgY2hlY2spCmNhcjo6bGV2ZW5lVGVzdCh0b29sbWFraW5nX3BlcmZvcm1hbmNlIH4gZ3JvdXAsIGRhdGEgPSBkZikKCiMgQU5DT1ZBOiBhZGp1c3QgZm9yIGdyb3NzIG1vdG9yIGV4cGVyaWVuY2UgYW5kIGNoZWNrIGlmIHRoZXJlIGFyZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGV4cGVyaW1lbnRhbCBhbmQgY29udHJvbCBncm91cHMKbG1fdG9vbG1ha2luZ19ncm91cHNfY29uX2dyb3NzIDwtIGxtKHRvb2xtYWtpbmdfcGVyZm9ybWFuY2UgfiBncm91cCArIGdyb3NzX21vdG9yX2V4cGVyaWVuY2UsIGRhdGEgPSBkZikKc3VtbWFyeShsbV90b29sbWFraW5nX2dyb3Vwc19jb25fZ3Jvc3MpCgojIEhvbW9nZW5laXR5IG9mIHJlZ3Jlc3Npb24gc2xvcGVzCiNsbV9ncm91cF9ncm9zc19pbnRlcmFjdGlvbiA8LSBsbSh0b29sbWFraW5nX3BlcmZvcm1hbmNlIH4gZ3JvdXAgKiBncm9zc19tb3Rvcl9leHBlcmllbmNlLCBkYXRhID0gZGYpCiNhbm92YShsbV90b29sbWFraW5nX2dyb3Vwc19jb25fZ3Jvc3MsIGxtX2dyb3VwX2dyb3NzX2ludGVyYWN0aW9uKQoKIyBRdWljayBsb29rIGF0IHRoZXNlIHZhcmlhYmxlcwpkZl9sb25nIDwtIGRmICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBjKGdyb3NzX21vdG9yX2V4cGVyaWVuY2UsIGZpbmVfbW90b3JfZXhwZXJpZW5jZSksCiAgICBuYW1lc190byA9ICJwcmVkaWN0b3IiLAogICAgdmFsdWVzX3RvID0gImV4cGVyaWVuY2UiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBwcmVkaWN0b3IgPSBmYWN0b3IoCiAgICAgIHByZWRpY3RvciwKICAgICAgbGV2ZWxzID0gYygiZ3Jvc3NfbW90b3JfZXhwZXJpZW5jZSIsICJmaW5lX21vdG9yX2V4cGVyaWVuY2UiKSwKICAgICAgbGFiZWxzID0gYygiZ3Jvc3MgbW90b3IgZXhwICh5ZWFycykiLAogICAgICAgICAgICAgICAgICJmaW5lIG1vdG9yIGV4cCAoeWVhcnMpIikKICAgICkKICApCgpnZ3Bsb3QoZGZfbG9uZywKICAgICAgIGFlcyhleHBlcmllbmNlLCB0b29sbWFraW5nX3BlcmZvcm1hbmNlLCBjb2xvciA9IGdyb3VwKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGFscGhhID0gLjgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUpICsKICBmYWNldF93cmFwKH4gcHJlZGljdG9yLCBucm93ID0gMSwgc2NhbGVzID0gImZyZWVfeCIpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gInRvb2xtYWtpbmcgcGVyZm9ybWFuY2UiLCBjb2xvciA9ICJncm91cCIpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDE0KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImNvbiIgPSBjb2xvciRjb24sImV4cCIgPSBjb2xvciRleHApKQoKcm0oZGYsIGRmX2xvbmcpCgpgYGAKCiMjIEVmZmVjdCBvZiBsYW5ndWFnZSBtZWFzdXJlcyAgCmBgYHtyIHRvb2xtYWtpbmdfcHJlZGljdG9yc19sYW5ndWFnZSwgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQoKZGYgPC0gZGF0YSAlPiUKICBmaWx0ZXIodHJhaW5pbmcgPT0gInByZSIpICU+JQogIG11dGF0ZShncm91cCA9IGZhY3Rvcihncm91cCwgbGV2ZWxzID0gYygiY29uIiwgImV4cCIpKSkKCiMgVmFyaWFibGVzIHVzZWQgZm9yIHRoaXMgYW5hbHlzaXMKc2VsZWN0X3ZhcmlhYmxlcyA8LSBjKCJncm91cCIsCiAgICAgICAgICAgICAgICAgICAgICAidG9vbG1ha2luZ19wZXJmb3JtYW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAic3ludGFjdGljX2NvbXBsZXhpdHkiLAogICAgICAgICAgICAgICAgICAgICAgIkFHTF9kX2NodW5rX3N0cmVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICJBR0xfZF9ncmFtbWF0aWNhbGl0eSIpCgpkZiA8LSBkZiAlPiUKICBzZWxlY3QoYWxsX29mKHNlbGVjdF92YXJpYWJsZXMpKSAlPiUKICBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpCgojIHRvb2xtYWtpbmcgYnkgbGFuZ3VhZ2UgdGFzayBzY29yZXMKbG1fdG9vbG1ha2luZ19sYW5ndWFnZSA8LSBsbSh0b29sbWFraW5nX3BlcmZvcm1hbmNlIH4gc3ludGFjdGljX2NvbXBsZXhpdHkgKyBBR0xfZF9ncmFtbWF0aWNhbGl0eSArIEFHTF9kX2NodW5rX3N0cmVuZ3RoLCBkYXRhID0gZGYpCmNoZWNrX21vZGVsKGxtX3Rvb2xtYWtpbmdfbGFuZ3VhZ2UpCgpzdW1tYXJ5KGxtX3Rvb2xtYWtpbmdfbGFuZ3VhZ2UpCgojIFF1aWNrIGxvb2sgYXQgdGhlc2UgdmFyaWFibGVzCmRmX2xvbmcgPC0gZGYgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGMoc3ludGFjdGljX2NvbXBsZXhpdHksCiAgICAgICAgICAgICBBR0xfZF9ncmFtbWF0aWNhbGl0eSwKICAgICAgICAgICAgIEFHTF9kX2NodW5rX3N0cmVuZ3RoKSwKICAgIG5hbWVzX3RvID0gInByZWRpY3RvciIsCiAgICB2YWx1ZXNfdG8gPSAic2NvcmUiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBwcmVkaWN0b3IgPSBmYWN0b3IoCiAgICAgIHByZWRpY3RvciwKICAgICAgbGV2ZWxzID0gYygic3ludGFjdGljX2NvbXBsZXhpdHkiLAogICAgICAgICAgICAgICAgICJBR0xfZF9ncmFtbWF0aWNhbGl0eSIsCiAgICAgICAgICAgICAgICAgIkFHTF9kX2NodW5rX3N0cmVuZ3RoIiksCiAgICAgIGxhYmVscyA9IGMoInN5bnRhY3RpYyBjb21wbGV4aXR5IiwKICAgICAgICAgICAgICAgICAiQUdMIGQnIGdyYW1tYXRpY2FsaXR5IiwKICAgICAgICAgICAgICAgICAiQUdMIGQnIGNodW5rIHN0cmVuZ3RoIikKICAgICkKICApCgpnZ3Bsb3QoZGZfbG9uZywKICAgICAgIGFlcyhzY29yZSwgdG9vbG1ha2luZ19wZXJmb3JtYW5jZSwgY29sb3IgPSBncm91cCkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IC44KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFKSArCiAgZmFjZXRfd3JhcCh+IHByZWRpY3RvciwgbnJvdyA9IDEsIHNjYWxlcyA9ICJmcmVlX3giKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJ0b29sbWFraW5nIHBlcmZvcm1hbmNlIHNjb3JlIiwgY29sb3IgPSAiZ3JvdXAiKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxNCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJjb24iID0gY29sb3IkY29uLCAiZXhwIiA9IGNvbG9yJGV4cCkpCgpybShkZiwgZGZfbG9uZykKCmBgYAoKCgojIFByZS10cmFpbmluZyBwYXJ0aWFsIGNvcnJlbGF0aW9uczogdG9vbG1ha2luZyBwZXJmb3JtYW5jZSBhbmQgYnJhaW4gbWVhc3VyZXMKYGBge3IgcGFydGlhbF9jb3JyZWxhdGlvbnNfcHJlX3RyYWluaW5nLCByZXN1bHRzPSdhc2lzJywgZXZhbD1UUlVFfQpkZiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHRyYWluaW5nID09ICJwcmUiKQoKdG9vbG1ha2luZ19wZXJmb3JtYW5jZSA8LSBkZiR0b29sbWFraW5nX3BlcmZvcm1hbmNlCmdyb3NzX21vdG9yX2V4cGVyaWVuY2UgPC0gZGYkZ3Jvc3NfbW90b3JfZXhwZXJpZW5jZQoKY2FwdGlvbnMgPC0gbGlzdCgKICBBUV9XTSAgPSAiKipUYWJsZSBTNCBBLioqIFBhcnRpYWwgY29ycmVsYXRpb25zIGJldHdlZW4gdG9vbG1ha2luZyBwZXJmb3JtYW5jZSBhbmQgQVEgb2YgV00gbWVhc3VyZXMgKGNvbnRyb2xsaW5nIGZvciBncm9zcyBtb3RvciBleHBlcmllbmNlKS4iLAogIEFRX0FGICA9ICIqKlRhYmxlIFM0IEIuKiogUGFydGlhbCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0b29sbWFraW5nIHBlcmZvcm1hbmNlIGFuZCBBUSBvZiBBRiBHTSB0ZXJtaW5hdGlvbnMgKGNvbnRyb2xsaW5nIGZvciBncm9zcyBtb3RvciBleHBlcmllbmNlKS4iLAogIEFRX1NMRiA9ICIqKlRhYmxlIFM0IEMuKiogUGFydGlhbCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0b29sbWFraW5nIHBlcmZvcm1hbmNlIGFuZCBBUSBvZiBTTEYgSUkvSUlJIEdNIHRlcm1pbmF0aW9ucyAoY29udHJvbGxpbmcgZm9yIGdyb3NzIG1vdG9yIGV4cGVyaWVuY2UpLiIsCiAgV00gICAgID0gIioqVGFibGUgUzQgRC4qKiBQYXJ0aWFsIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRvb2xtYWtpbmcgcGVyZm9ybWFuY2UgYW5kIFdNIG1lYXN1cmVzIChjb250cm9sbGluZyBmb3IgZ3Jvc3MgbW90b3IgZXhwZXJpZW5jZSkuIiwKICBBRl9MICAgPSAiKipUYWJsZSBTNCBFLioqIFBhcnRpYWwgY29ycmVsYXRpb25zIGJldHdlZW4gdG9vbG1ha2luZyBwZXJmb3JtYW5jZSBhbmQgQUYgbGVmdCBoZW1pc3BoZXJlIEdNIHRlcm1pbmF0aW9ucyAoY29udHJvbGxpbmcgZm9yIGdyb3NzIG1vdG9yIGV4cGVyaWVuY2UpLiIsCiAgQUZfUiAgID0gIioqVGFibGUgUzQgRi4qKiBQYXJ0aWFsIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRvb2xtYWtpbmcgcGVyZm9ybWFuY2UgYW5kIEFGIHJpZ2h0IGhlbWlzcGhlcmUgR00gdGVybWluYXRpb25zIChjb250cm9sbGluZyBmb3IgZ3Jvc3MgbW90b3IgZXhwZXJpZW5jZSkuIiwKICBTTEZfTCAgPSAiKipUYWJsZSBTNCBHLioqIFBhcnRpYWwgY29ycmVsYXRpb25zIGJldHdlZW4gdG9vbG1ha2luZyBwZXJmb3JtYW5jZSBhbmQgU0xGIElJL0lJSSBsZWZ0IGhlbWlzcGhlcmUgR00gdGVybWluYXRpb25zIChjb250cm9sbGluZyBmb3IgZ3Jvc3MgbW90b3IgZXhwZXJpZW5jZSkuIiwKICBTTEZfUiAgPSAiKipUYWJsZSBTNCBILioqIFBhcnRpYWwgY29ycmVsYXRpb25zIGJldHdlZW4gdG9vbG1ha2luZyBwZXJmb3JtYW5jZSBhbmQgU0xGIElJL0lJSSByaWdodCBoZW1pc3BoZXJlIEdNIHRlcm1pbmF0aW9ucyAoY29udHJvbGxpbmcgZm9yIGdyb3NzIG1vdG9yIGV4cGVyaWVuY2UpLiIKKQoKc3VidGl0bGVzIDwtIGxpc3QoCiAgQVFfV00gID0gInRvb2xtYWtpbmcgeCBBUSBvZiBXTSBtZXRyaWNzXG4oY29udHJvbDogZ3Jvc3MgbW90b3IgZXhwKSIsCiAgQVFfQUYgID0gInRvb2xtYWtpbmcgeCBBUSBvZiBBRiBHTSB0ZXJtaW5hdGlvbnNcbihjb250cm9sOiBncm9zcyBtb3RvciBleHApIiwKICBBUV9TTEYgPSAidG9vbG1ha2luZyB4IEFRIG9mIFNMRiBJSS9JSUkgR00gdGVybWluYXRpb25zXG4oY29udHJvbDogZ3Jvc3MgbW90b3IgZXhwKSIsCiAgV00gICAgID0gInRvb2xtYWtpbmcgeCBXTSBtZWFzdXJlc1xuKGNvbnRyb2w6IGdyb3NzIG1vdG9yIGV4cCkiLAogIEFGX0wgICA9ICJ0b29sbWFraW5nIHggQUYgbGVmdCBoZW1pc3BoZXJlIEdNIHRlcm1pbmF0aW9uc1xuKGNvbnRyb2w6IGdyb3NzIG1vdG9yIGV4cCkiLAogIEFGX1IgICA9ICJ0b29sbWFraW5nIHggQUYgcmlnaHQgaGVtaXNwaGVyZSBHTSB0ZXJtaW5hdGlvbnNcbihjb250cm9sOiBncm9zcyBtb3RvciBleHApIiwKICBTTEZfTCAgPSAidG9vbG1ha2luZyB4IFNMRiBJSS9JSUkgbGVmdCBoZW1pc3BoZXJlIEdNIHRlcm1pbmF0aW9uc1xuKGNvbnRyb2w6IGdyb3NzIG1vdG9yIGV4cCkiLAogIFNMRl9SICA9ICJ0b29sbWFraW5nIHggU0xGIElJL0lJSSByaWdodCBoZW1pc3BoZXJlIEdNIHRlcm1pbmF0aW9uc1xuKGNvbnRyb2w6IGdyb3NzIG1vdG9yIGV4cCkiCikKCgpyZXN1bHRzX3Bjb3JyX3Rvb2xfYnJhaW5fUFJFX3RyYWluaW5nIDwtIGxpc3QoKQoKZm9yIChmYW0gaW4gbmFtZXMoYnJhaW5fZmFtaWxpZXMpKSB7CgogIHBjb3JyIDwtIGNhbGN1bGF0ZV90b29sbWFraW5nX2JyYWluX3Bjb3JyKAogICAgdG9vbG1ha2luZ19wZXJmb3JtYW5jZSwKICAgIGRmWywgYnJhaW5fZmFtaWxpZXNbW2ZhbV1dLCBkcm9wID0gRkFMU0VdLAogICAgZ3Jvc3NfbW90b3JfZXhwZXJpZW5jZQogICkKCiAgcmVzdWx0c19wY29ycl90b29sX2JyYWluX1BSRV90cmFpbmluZ1tbZmFtXV0gPC0gcGNvcnIKCiAgcHJpbnQodGFibGVfdG9vbG1ha2luZ19icmFpbl9wY29ycigKICAgIHBjb3JyLAogICAgY2FwdGlvbiA9IGNhcHRpb25zW1tmYW1dXQogICkpCgogIHByaW50KHBsb3RfdG9vbG1ha2luZ19icmFpbl9oZWF0bWFwKAogICAgcGNvcnIsCiAgICB0aXRsZSA9ICJQYXJ0aWFsIGNvcnJlbGF0aW9uIiwKICAgIHN1YnRpdGxlID0gc3VidGl0bGVzW1tmYW1dXSwKICAgIGZpbGVuYW1lID0gcGFzdGUwKCJmaWd1cmVzL3Bjb3JyX2hlYXRtYXBfdG9vbG1ha2luZ18iLCBmYW0sICIucG5nIikKICApKQp9CgpybShkZikKCgpgYGAKCiMgTGFuZ3VhZ2UgYXB0aXR1ZGUgKHN5bnRhY3RpYyBjb21wbGV4aXR5KSBhbmQgYnJhaW4gY29ycmVsYXRpb25zCmBgYHtyIGxhbmd1YWdlX2JyYWluX2NvcnJlbGF0aW9ucywgcmVzdWx0cz0nYXNpcycsIGV2YWw9VFJVRX0KIyBQcmUtdHJhaW5pbmcgc3Vic2V0IGFuZCBsYW5ndWFnZSBwcmVkaWN0b3IKZGYgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih0cmFpbmluZyA9PSAicHJlIikKCmxhbmd1YWdlX21lYXN1cmVzID0gYygic3ludGFjdGljX2NvbXBsZXhpdHkiKQoKY2FwdGlvbnMgPC0gbGlzdCgKICBBUV9XTSAgPSAiKipUYWJsZSBTNSBBLioqIENvcnJlbGF0aW9uOiBsYW5ndWFnZSBhcHRpdHVkZSDDlyBBUSBvZiBXTSBtZWFzdXJlcyIsCiAgQVFfQUYgID0gIioqVGFibGUgUzUgQi4qKiBDb3JyZWxhdGlvbjogbGFuZ3VhZ2UgYXB0aXR1ZGUgw5cgQVEgb2YgQUYgR00gdGVybWluYXRpb25zIiwKICBBUV9TTEYgPSAiKipUYWJsZSBTNSBDLioqIENvcnJlbGF0aW9uOiBsYW5ndWFnZSBhcHRpdHVkZSDDlyBBUSBvZiBTTEYgSUkvSUlJIEdNIHRlcm1pbmF0aW9ucyIsCiAgV00gICAgID0gIioqVGFibGUgUzUgRC4qKiBDb3JyZWxhdGlvbjogbGFuZ3VhZ2UgYXB0aXR1ZGUgw5cgV00gbWVhc3VyZXMiLAogIEFGX0wgICA9ICIqKlRhYmxlIFM1IEUuKiogQ29ycmVsYXRpb246IGxhbmd1YWdlIGFwdGl0dWRlIMOXIEFGIGxlZnQgR00gdGVybWluYXRpb25zIiwKICBBRl9SICAgPSAiKipUYWJsZSBTNSBGLioqIENvcnJlbGF0aW9uOiBsYW5ndWFnZSBhcHRpdHVkZSDDlyBBRiByaWdodCBHTSB0ZXJtaW5hdGlvbnMiLAogIFNMRl9MICA9ICIqKlRhYmxlIFM1IEcuKiogQ29ycmVsYXRpb246IGxhbmd1YWdlIGFwdGl0dWRlIMOXIFNMRiBJSS9JSUkgbGVmdCBHTSB0ZXJtaW5hdGlvbnMiLAogIFNMRl9SICA9ICIqKlRhYmxlIFM1IEguKiogQ29ycmVsYXRpb246IGxhbmd1YWdlIGFwdGl0dWRlIMOXIFNMRiBJSS9JSUkgcmlnaHQgR00gdGVybWluYXRpb25zIgopCgpzdWJ0aXRsZXMgPC0gbGlzdCgKICBBUV9XTSAgPSAibGFuZ3VhZ2UgYXB0aXR1ZGUgw5cgQVEgb2YgV00gbWV0cmljcyAoUFJFKVxuKEJIIHEgPCAwLjI1IG1hcmtlZCAqKSIsCiAgQVFfQUYgID0gImxhbmd1YWdlIGFwdGl0dWRlIMOXIEFRIG9mIEFGIEdNIHRlcm1pbmF0aW9ucyAoUFJFKVxuKEJIIHEgPCAwLjI1IG1hcmtlZCAqKSIsCiAgQVFfU0xGID0gImxhbmd1YWdlIGFwdGl0dWRlIMOXIEFRIG9mIFNMRiBJSS9JSUkgR00gdGVybWluYXRpb25zIChQUkUpXG4oQkggcSA8IDAuMjUgbWFya2VkICopIiwKICBXTSAgICAgPSAibGFuZ3VhZ2UgYXB0aXR1ZGUgw5cgV00gbWVhc3VyZXMgKFBSRSlcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiLAogIEFGX0wgICA9ICJsYW5ndWFnZSBhcHRpdHVkZSDDlyBBRiBsZWZ0IEdNIHRlcm1pbmF0aW9ucyAoUFJFKVxuKEJIIHEgPCAwLjI1IG1hcmtlZCAqKSIsCiAgQUZfUiAgID0gImxhbmd1YWdlIGFwdGl0dWRlIMOXIEFGIHJpZ2h0IEdNIHRlcm1pbmF0aW9ucyAoUFJFKVxuKEJIIHEgPCAwLjI1IG1hcmtlZCAqKSIsCiAgU0xGX0wgID0gImxhbmd1YWdlIGFwdGl0dWRlIMOXIFNMRiBJSS9JSUkgbGVmdCBHTSB0ZXJtaW5hdGlvbnMgKFBSRSlcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiLAogIFNMRl9SICA9ICJsYW5ndWFnZSBhcHRpdHVkZSDDlyBTTEYgSUkvSUlJIHJpZ2h0IEdNIHRlcm1pbmF0aW9ucyAoUFJFKVxuKEJIIHEgPCAwLjI1IG1hcmtlZCAqKSIKKQoKY29ycl9yZXN1bHRzIDwtIGxpc3QoKQoKZm9yIChmYW0gaW4gbmFtZXMoYnJhaW5fZmFtaWxpZXMpKSB7CgogIGNvcnJfcmVzdWx0c1tbZmFtXV0gPC0gY2FsY3VsYXRlX2xhbmd1YWdlX2JyYWluX2NvcnIoCiAgICBkZiwKICAgIGxhbmd1YWdlX3ZhcnMgPSBsYW5ndWFnZV9tZWFzdXJlcywKICAgIGJyYWluX3ZhcnMgPSBicmFpbl9mYW1pbGllc1tbZmFtXV0KICApCgogIHByaW50KHRhYmxlX2xhbmd1YWdlX2JyYWluX2NvcnIoCiAgICBjb3JyX3Jlc3VsdHNbW2ZhbV1dLAogICAgbGFuZ3VhZ2VfaGVhZGVycyA9IGMoIlN5bnRhY3RpYyBDb21wbGV4aXR5IiksCiAgICBjYXB0aW9uID0gY2FwdGlvbnNbW2ZhbV1dCiAgKSkKCiAgcHJpbnQocGxvdF9sYW5ndWFnZV9icmFpbl9oZWF0bWFwKAogICAgY29ycl9yZXN1bHRzW1tmYW1dXSwKICAgIHRpdGxlID0gIkNvcnJlbGF0aW9uIiwKICAgIHN1YnRpdGxlID0gc3VidGl0bGVzW1tmYW1dXSwKICAgIGZpbGVuYW1lID0gcGFzdGUwKCJmaWd1cmVzL2NvcnJfaGVhdG1hcF9sYW5ndWFnZV8iLCBmYW0sICIucG5nIikKICApKQp9CgpybShkZikKCmBgYAoKIyBBR0wgc2NvcmVzIChncmFtbWF0aWNhbGl0eSBhbmQgY2h1bmsgc3RyZW5ndGgpIGFuZCBicmFpbiBjb3JyZWxhdGlvbnMKYGBge3IgYWdsX2JyYWluX2NvcnJlbGF0aW9ucywgcmVzdWx0cz0nYXNpcycsIGV2YWw9VFJVRX0KIyBQcmUtdHJhaW5pbmcgc3Vic2V0IGFuZCBsYW5ndWFnZSBwcmVkaWN0b3IKZGYgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcih0cmFpbmluZyA9PSAicHJlIikKCmFnbF9tZWFzdXJlcyA9IGMoIkFHTF9kX2dyYW1tYXRpY2FsaXR5IiwgIkFHTF9kX2NodW5rX3N0cmVuZ3RoIikKCmNhcHRpb25zIDwtIGxpc3QoCiAgQVFfV00gID0gIioqVGFibGUgUzYgQS4qKiBDb3JyZWxhdGlvbjogQUdMIHNjb3JlcyDDlyBBUSBvZiBXTSBtZWFzdXJlcyIsCiAgQVFfQUYgID0gIioqVGFibGUgUzYgQi4qKiBDb3JyZWxhdGlvbjogQUdMIHNjb3JlcyDDlyBBUSBvZiBBRiBHTSB0ZXJtaW5hdGlvbnMiLAogIEFRX1NMRiA9ICIqKlRhYmxlIFM2IEMuKiogQ29ycmVsYXRpb246IEFHTCBzY29yZXMgw5cgQVEgb2YgU0xGIElJL0lJSSBHTSB0ZXJtaW5hdGlvbnMiLAogIFdNICAgICA9ICIqKlRhYmxlIFM2IEQuKiogQ29ycmVsYXRpb246IEFHTCBzY29yZXMgw5cgV00gbWVhc3VyZXMiLAogIEFGX0wgICA9ICIqKlRhYmxlIFM2IEUuKiogQ29ycmVsYXRpb246IEFHTCBzY29yZXMgw5cgQUYgbGVmdCBHTSB0ZXJtaW5hdGlvbnMiLAogIEFGX1IgICA9ICIqKlRhYmxlIFM2IEYuKiogQ29ycmVsYXRpb246IEFHTCBzY29yZXMgw5cgQUYgcmlnaHQgR00gdGVybWluYXRpb25zIiwKICBTTEZfTCAgPSAiKipUYWJsZSBTNiBHLioqIENvcnJlbGF0aW9uOiBBR0wgc2NvcmVzIMOXIFNMRiBJSS9JSUkgbGVmdCBHTSB0ZXJtaW5hdGlvbnMiLAogIFNMRl9SICA9ICIqKlRhYmxlIFM2IEguKiogQ29ycmVsYXRpb246IEFHTCBzY29yZXMgw5cgU0xGIElJL0lJSSByaWdodCBHTSB0ZXJtaW5hdGlvbnMiCikKCnN1YnRpdGxlcyA8LSBsaXN0KAogIEFRX1dNICA9ICJBR0wgc2NvcmVzIMOXIEFRIG9mIFdNIG1ldHJpY3MgKFBSRSlcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiLAogIEFRX0FGICA9ICJBR0wgc2NvcmVzIMOXIEFRIG9mIEFGIEdNIHRlcm1pbmF0aW9ucyAoUFJFKVxuKEJIIHEgPCAwLjI1IG1hcmtlZCAqKSIsCiAgQVFfU0xGID0gIkFHTCBzY29yZXMgw5cgQVEgb2YgU0xGIElJL0lJSSBHTSB0ZXJtaW5hdGlvbnMgKFBSRSlcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiLAogIFdNICAgICA9ICJBR0wgc2NvcmVzIMOXIFdNIG1lYXN1cmVzIChQUkUpXG4oQkggcSA8IDAuMjUgbWFya2VkICopIiwKICBBRl9MICAgPSAiQUdMIHNjb3JlcyDDlyBBRiBsZWZ0IEdNIHRlcm1pbmF0aW9ucyAoUFJFKVxuKEJIIHEgPCAwLjI1IG1hcmtlZCAqKSIsCiAgQUZfUiAgID0gIkFHTCBzY29yZXMgw5cgQUYgcmlnaHQgR00gdGVybWluYXRpb25zIChQUkUpXG4oQkggcSA8IDAuMjUgbWFya2VkICopIiwKICBTTEZfTCAgPSAiQUdMIHNjb3JlcyDDlyBTTEYgSUkvSUlJIGxlZnQgR00gdGVybWluYXRpb25zIChQUkUpXG4oQkggcSA8IDAuMjUgbWFya2VkICopIiwKICBTTEZfUiAgPSAiQUdMIHNjb3JlcyDDlyBTTEYgSUkvSUlJIHJpZ2h0IEdNIHRlcm1pbmF0aW9ucyAoUFJFKVxuKEJIIHEgPCAwLjI1IG1hcmtlZCAqKSIKKQoKYWdsX2NvcnJfcmVzdWx0cyA8LSBsaXN0KCkKCmZvciAoZmFtIGluIG5hbWVzKGJyYWluX2ZhbWlsaWVzKSkgewoKICBhZ2xfY29ycl9yZXN1bHRzW1tmYW1dXSA8LSBjYWxjdWxhdGVfbGFuZ3VhZ2VfYnJhaW5fY29ycigKICAgIGRmLAogICAgbGFuZ3VhZ2VfdmFycyA9IGFnbF9tZWFzdXJlcywKICAgIGJyYWluX3ZhcnMgPSBicmFpbl9mYW1pbGllc1tbZmFtXV0KICApCgogIHByaW50KHRhYmxlX2xhbmd1YWdlX2JyYWluX2NvcnIoCiAgICBhZ2xfY29ycl9yZXN1bHRzW1tmYW1dXSwKICAgIGxhbmd1YWdlX2hlYWRlcnMgPSBjKCJBR0wgZCcgZ3JhbW1hdGljYWxpdHkiLCAiQUdMIGQnIGNodW5rIHN0cmVuZ3RoIiksCiAgICBjYXB0aW9uID0gY2FwdGlvbnNbW2ZhbV1dCiAgKSkKCiAgcHJpbnQocGxvdF9sYW5ndWFnZV9icmFpbl9oZWF0bWFwKAogICAgYWdsX2NvcnJfcmVzdWx0c1tbZmFtXV0sCiAgICB0aXRsZSA9ICJDb3JyZWxhdGlvbiIsCiAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlc1tbZmFtXV0sCiAgICBmaWxlbmFtZSA9IHBhc3RlMCgiZmlndXJlcy9jb3JyX2hlYXRtYXBfYWdsXyIsIGZhbSwgIi5wbmciKQogICkpCn0KCnJtKGRmKQoKYGBgCiMgTWl4ZWQtZGVzaWduIEFOT1ZBIGZvciB0cmFpbmluZyBlZmZlY3RzCmBgYHtyIG1peGVkX2Rlc2lnbl9hbm92YSwgcmVzdWx0cz0nYXNpcycsIGV2YWw9VFJVRX0KIyBNaXhlZC1kZXNpZ24gQU5PVkEgYnkgZmFtaWx5CgojIENhcHRpb25zIChtYXRjaCBuYW1lcyBhYm92ZSkKYW5vdmFfY2FwdGlvbnMgPC0gbGlzdCgKICBBUV9XTSAgPSAiKipUYWJsZSBTNyBBLioqIE1peGVkIGRlc2lnbiBBTk9WQSBmb3IgQVEgV00gbWVhc3VyZXMuIiwKICBBUV9BRiAgPSAiKipUYWJsZSBTNyBCLioqIE1peGVkIGRlc2lnbiBBTk9WQSBmb3IgQVEgb2YgQUYgR00gdGVybWluYXRpb25zLiIsCiAgQVFfU0xGID0gIioqVGFibGUgUzcgQy4qKiBNaXhlZCBkZXNpZ24gQU5PVkEgZm9yIEFRIG9mIFNMRiBJSS9JSUkgR00gdGVybWluYXRpb25zLiIsCiAgV00gICAgID0gIioqVGFibGUgUzcgRC4qKiBNaXhlZCBkZXNpZ24gQU5PVkEgZm9yIFdNIG1lYXN1cmVzLiIsCiAgQUZfTCAgID0gIioqVGFibGUgUzcgRS4qKiBNaXhlZCBkZXNpZ24gQU5PVkEgZm9yIEFGIGxlZnQgR00gdGVybWluYXRpb25zLiIsCiAgQUZfUiAgID0gIioqVGFibGUgUzcgRi4qKiBNaXhlZCBkZXNpZ24gQU5PVkEgZm9yIEFGIHJpZ2h0IEdNIHRlcm1pbmF0aW9ucy4iLAogIFNMRl9MICA9ICIqKlRhYmxlIFM3IEcuKiogTWl4ZWQgZGVzaWduIEFOT1ZBIGZvciBTTEYgSUkvSUlJIGxlZnQgR00gdGVybWluYXRpb25zLiIsCiAgU0xGX1IgID0gIioqVGFibGUgUzcgSC4qKiBNaXhlZCBkZXNpZ24gQU5PVkEgZm9yIFNMRiBJSS9JSUkgcmlnaHQgR00gdGVybWluYXRpb25zLiIKKQoKIyBSdW4gKyBzdG9yZQpyZXN1bHRzX21peGVkX2Fub3ZhIDwtIGxpc3QoKQoKZm9yIChmYW0gaW4gbmFtZXMoYnJhaW5fZmFtaWxpZXMpKSB7CiAgcmVzdWx0c19taXhlZF9hbm92YVtbZmFtXV0gPC0gcnVuX21peGVkX2Rlc2lnbl9hbm92YShkYXRhLCBicmFpbl9mYW1pbGllc1tbZmFtXV0pCgogICMgcHJpbnQgdGFibGUgaW4gUm1kCiAgcHJpbnQodGFibGVfYW5vdmFfcmVzdWx0cyhyZXN1bHRzX21peGVkX2Fub3ZhW1tmYW1dXSwgY2FwdGlvbiA9IGFub3ZhX2NhcHRpb25zW1tmYW1dXSkpCn0KCmBgYAoKIyMgUG9zdC1ob2MgYW5hbHlzZXMgYWZ0ZXIgQU5PVkEKYGBge3IgZm9sbG93dXBfYW5hbHlzaXNfYW5vdmEsIHJlc3VsdHM9J2FzaXMnLCBldmFsPVRSVUV9CgpydW5fZm9sbG93dXAgPC0gYygiQVFfQUZfYXZlcmFnZUZBIiwgIkFGX0xfU1RHIiwgIkFGX0xfTVRHIiwgIkFRX1NMRl9CQTQ0IiwgIlNMRl9MX0JBNDQiKQoKcGxvdHNfZGVsdGEgICAgPC0gbGlzdCgpCnJlc19kZWx0YXMgICAgIDwtIGxpc3QoKQoKZm9yIChtZWFzdXJlIGluIHJ1bl9mb2xsb3d1cCkgewoKICAjIDEpIERlbHRhIGFuYWx5c2lzCiAgcmVzX2RlbHRhIDwtIGFub3ZhX2ZvbGxvd3VwX2RlbHRhKGRhdGEsIG1lYXN1cmUpCiAgcmVzX2RlbHRhc1tbbWVhc3VyZV1dIDwtIHJlc19kZWx0YQoKICAjIDIpIERlbHRhIHBsb3QKICBwX2RlbHRhIDwtIGFub3ZhX2ZvbGxvd3VwX2RlbHRhX3Bsb3QoCiAgICByZXNfZGVsdGEsCiAgICB0aXRsZSAgID0gcGFzdGUwKG1lYXN1cmUsICI6IGNoYW5nZSBzY29yZSIpLAogICAgeV9sYWJlbCA9IHBhc3RlMCgiXHUwMzk0ICIsIG1lYXN1cmUsICIgKHBvc3QgXHUyMjEyIHByZSkiKSwKICAgIGZpbGVuYW1lID0gcGFzdGUwKCJmaWd1cmVzL2Fub3ZhX2RlbHRhX3Bsb3RfIiwgbWVhc3VyZSwgIi5wbmciKQogICkKICBwbG90c19kZWx0YVtbbWVhc3VyZV1dIDwtIHBfZGVsdGEKICBwcmludChwX2RlbHRhKQoKICAjIDMpIERldGFpbGVkIC8gaW50ZXJhY3Rpb24gcGxvdAogIHBfZGV0YWlsZWQgPC0gYW5vdmFfZm9sbG93dXBfZGV0YWlsZWRfcGxvdCgKICAgIGRhdGEsCiAgICBtZWFzdXJlLAogICAgdGl0bGUgPSBwYXN0ZTAobWVhc3VyZSwgIjogaW50ZXJhY3Rpb24iKSwKICAgIGZpbGVuYW1lID0gcGFzdGUwKCJmaWd1cmVzL2Fub3ZhX2RldGFpbGVkX3Bsb3RfIiwgbWVhc3VyZSwgIi5wbmciKQogICkKICBwcmludChwX2RldGFpbGVkKQp9CgoKYGBgCgojIFByZS1wb3N0IHRyYWluaW5nIGNoYW5nZXMgaW4gY29ycmVsYXRpb25zCgpgYGB7ciBwcmVwb3N0X2NvcnJlbGF0aW9uX2NoYW5nZXMsIHJlc3VsdHM9J2FzaXMnLCBldmFsPVRSVUV9CmRmIDwtIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gImV4cCIpCgpwcmVwb3N0X2NhcHRpb25zIDwtIGxpc3QoCiAgQVFfV00gID0gIioqVGFibGUgUzggQS4qKiBQcmXigJNwb3N0IGNoYW5nZSBpbiBwYXJ0aWFsIGNvcnJlbGF0aW9ucyAoY29udHJvbGxpbmcgZ3Jvc3MgbW90b3IgZXhwZXJpZW5jZSkgZm9yIEFRIFdNIG1lYXN1cmVzLiIsCiAgQVFfQUYgID0gIioqVGFibGUgUzggQi4qKiBQcmXigJNwb3N0IGNoYW5nZSBpbiBwYXJ0aWFsIGNvcnJlbGF0aW9ucyAoY29udHJvbGxpbmcgZ3Jvc3MgbW90b3IgZXhwZXJpZW5jZSkgZm9yIEFRIEFGIEdNIHRlcm1pbmF0aW9ucy4iLAogIEFRX1NMRiA9ICIqKlRhYmxlIFM4IEMuKiogUHJl4oCTcG9zdCBjaGFuZ2UgaW4gcGFydGlhbCBjb3JyZWxhdGlvbnMgKGNvbnRyb2xsaW5nIGdyb3NzIG1vdG9yIGV4cGVyaWVuY2UpIGZvciBBUSBTTEYgSUkvSUlJIEdNIHRlcm1pbmF0aW9ucy4iLAogIFdNICAgICA9ICIqKlRhYmxlIFM4IEQuKiogUHJl4oCTcG9zdCBjaGFuZ2UgaW4gcGFydGlhbCBjb3JyZWxhdGlvbnMgKGNvbnRyb2xsaW5nIGdyb3NzIG1vdG9yIGV4cGVyaWVuY2UpIGZvciBXTSBtZWFzdXJlcy4iLAogIEFGX0wgICA9ICIqKlRhYmxlIFM4IEUuKiogUHJl4oCTcG9zdCBjaGFuZ2UgaW4gcGFydGlhbCBjb3JyZWxhdGlvbnMgKGNvbnRyb2xsaW5nIGdyb3NzIG1vdG9yIGV4cGVyaWVuY2UpIGZvciBBRiBsZWZ0IEdNIHRlcm1pbmF0aW9ucy4iLAogIEFGX1IgICA9ICIqKlRhYmxlIFM4IEYuKiogUHJl4oCTcG9zdCBjaGFuZ2UgaW4gcGFydGlhbCBjb3JyZWxhdGlvbnMgKGNvbnRyb2xsaW5nIGdyb3NzIG1vdG9yIGV4cGVyaWVuY2UpIGZvciBBRiByaWdodCBHTSB0ZXJtaW5hdGlvbnMuIiwKICBTTEZfTCAgPSAiKipUYWJsZSBTOCBHLioqIFByZeKAk3Bvc3QgY2hhbmdlIGluIHBhcnRpYWwgY29ycmVsYXRpb25zIChjb250cm9sbGluZyBncm9zcyBtb3RvciBleHBlcmllbmNlKSBmb3IgU0xGIElJL0lJSSBsZWZ0IEdNIHRlcm1pbmF0aW9ucy4iLAogIFNMRl9SICA9ICIqKlRhYmxlIFM4IEguKiogUHJl4oCTcG9zdCBjaGFuZ2UgaW4gcGFydGlhbCBjb3JyZWxhdGlvbnMgKGNvbnRyb2xsaW5nIGdyb3NzIG1vdG9yIGV4cGVyaWVuY2UpIGZvciBTTEYgSUkvSUlJIHJpZ2h0IEdNIHRlcm1pbmF0aW9ucy4iCikKCnJlc3VsdHNfRVhQX3Rvb2xtYWtpbmdfcHJlcG9zdF9wY29ycl9jaGFuZ2UgPC0gbGlzdCgpCgpmb3IgKGZhbSBpbiBuYW1lcyhicmFpbl9mYW1pbGllcykpIHsKCiAgZmFtaWx5X3ZhcnMgPC0gYXMuY2hhcmFjdGVyKGJyYWluX2ZhbWlsaWVzW1tmYW1dXSkKICBmYW1pbHlfdmFycyA8LSBmYW1pbHlfdmFyc1tmYW1pbHlfdmFycyAlaW4lIG5hbWVzKGRmKV0gICMga2VlcCBvbmx5IGV4aXN0aW5nIGNvbHVtbnMKCiAgIyAxKSBBTkFMWVNJUwogIHJlc19yYXcgPC0gcGFydGlhbF9wcmVwb3N0X2NvbXBhcmUoCiAgICBkZiAgICAgICAgPSBkZiwKICAgIG1lYXN1cmVzICA9IGZhbWlseV92YXJzLAogICAgeHZhciAgICAgID0gInRvb2xtYWtpbmdfcGVyZm9ybWFuY2UiLAogICAgY29udHJvbCAgID0gImdyb3NzX21vdG9yX2V4cGVyaWVuY2UiLAogICAgdGltZSAgICAgID0gInRyYWluaW5nIiwKICAgIHByZV9sZXZlbCA9ICJwcmUiLAogICAgcG9zdF9sZXZlbCA9ICJwb3N0IgogICkKCiAgIyAyKSBUQUJMRTogY29tcHV0ZSBjb2x1bW5zICsgRk9SQ0UgT1JERVIgdG8gbWF0Y2ggZmFtaWx5X3ZhcnMKICByZXNfdGFiIDwtIHJlc19yYXcgJT4lCiAgICBkcGx5cjo6bXV0YXRlKAogICAgICBmYW1pbHkgPSBmYW0sCiAgICAgIHBfYWRqID0gcC5hZGp1c3QocCwgbWV0aG9kID0gIkJIIiksCiAgICAgIHNpZyAgID0gIWlzLm5hKHBfYWRqKSAmIHBfYWRqIDwgMC4yNSwKICAgICAgZGVsdGFfciA9IHBvc3RfciAtIHByZV9yLAogICAgICBkaXIgICA9IGRwbHlyOjppZl9lbHNlKGRlbHRhX3IgPj0gMCwgIkluY3JlYXNlIiwgIkRlY3JlYXNlIikKICAgICkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKAogICAgICB2YXJpYWJsZSA9IGZhY3Rvcih2YXJpYWJsZSwgbGV2ZWxzID0gZmFtaWx5X3ZhcnMpLAogICAgICB2YXJpYWJsZV9sYWJlbCA9IGZhY3Rvcihnc3ViKCJfIiwgIiAiLCB2YXJpYWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGdzdWIoIl8iLCAiICIsIGZhbWlseV92YXJzKSkKICAgICkgJT4lCiAgICBkcGx5cjo6YXJyYW5nZSh2YXJpYWJsZSkgJT4lICAgIyBmYWN0b3Igb3JkZXIgKGZhbWlseSBvcmRlcikKICAgIGRwbHlyOjptdXRhdGUoCiAgICAgIHZhcmlhYmxlID0gYXMuY2hhcmFjdGVyKHZhcmlhYmxlKSAgIyBvcHRpb25hbDoga2VlcCBwcmludGluZyBuaWNlciBpbiB0YWJsZXMKICAgICkKCiAgcmVzdWx0c19FWFBfdG9vbG1ha2luZ19wcmVwb3N0X3Bjb3JyX2NoYW5nZVtbZmFtXV0gPC0gcmVzX3RhYgoKICAjIFByaW50IHRhYmxlIChvcmRlciBwcmVzZXJ2ZWQ7IG5vIHNvcnRpbmcpCiAgcHJpbnQodGFibGVfcHJlcG9zdF9wY29ycl9jaGFuZ2VzKHJlc190YWIsIGNhcHRpb24gPSBwcmVwb3N0X2NhcHRpb25zW1tmYW1dXSkpCgogICMgMykgUExPVCAob3JkZXIgcHJlc2VydmVkIHZpYSBmYWN0b3IgbGV2ZWxzKQogIHAgPC0gcGxvdF9wcmVwb3N0X3Bjb3JyX2NoYW5nZV9hc19hcnJvd3MoCiAgICBkZl9mYW1pbHkgPSByZXNfdGFiLAogICAgdGl0bGVfcHJlZml4ID0gIlByZS1Qb3N0IENvcnJlbGF0aW9uIENoYW5nZXM6IiwKICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcnJvd3Mgc2hvdyBkaXJlY3Rpb24gb2YgY2hhbmdlOyAqIHE8IDAuMjUgKEJIKSIpCiAgKQogIHByaW50KHApCgogICMgT3B0aW9uYWwgc2F2ZQogIGdncGxvdDI6Omdnc2F2ZSgKICAgIGZpbGVuYW1lID0gcGFzdGUwKCJmaWd1cmVzL2NoYW5nZV9jb3JyZWxhdGlvbnNfIiwgZmFtLCAiLnBuZyIpLAogICAgcGxvdCA9IHAsIHdpZHRoID0gMTAsIGhlaWdodCA9IDgsIGRwaSA9IDMwMCwgZGV2aWNlID0gInBuZyIKICApCn0KCnNhdmUocmVzdWx0c19FWFBfdG9vbG1ha2luZ19wcmVwb3N0X3Bjb3JyX2NoYW5nZSwgZmlsZSA9IGhlcmUoInJlc3VsdHMiLCAiUkRhdGEiLCAicmVzdWx0c19FWFBfdG9vbG1ha2luZ19wcmVwb3N0X3Bjb3JyX2NoYW5nZS5SRGF0YSIpKQoKYGBgCgoKIyBIYW5kYXhlIG1vcnBob2xvZ3kgCgojIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnRyb2wgZm9yIGdyb3NzLW1vdG9yIGV4cGVyaWVuY2UKYGBge3IgZG9lc19tb3Rvcl9leHBlcmllbmNlX3ByZWRpY3RfcGNhX3ByZV90b29sbWFraW5nLCByZXN1bHRzPSdhc2lzJywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXZhbD1UUlVFfQojIEZpbHRlciBwcmUtdHJhaW5pbmcgZGF0YSBvbmx5CmRmIDwtIGRhdGEgJT4lIGZpbHRlcih0cmFpbmluZyA9PSAicHJlIikKCiMgTGluZWFyIG1vZGVsczogcHJlZGljdGluZyBQQ190aGluIGFuZCBQQ19sb25nIGZyb20gZ3Jvc3MgYW5kIGZpbmUgbW90b3IgZXhwZXJpZW5jZQptb2RlbF9QQ190aGluIDwtIGxtKFBDX3RoaW4gfiBncm9zc19tb3Rvcl9leHBlcmllbmNlICsgZmluZV9tb3Rvcl9leHBlcmllbmNlLCBkYXRhID0gZGYpCmNoZWNrX21vZGVsKG1vZGVsX1BDX3RoaW4pCnByaW50KHN1bW1hcnkobW9kZWxfUENfdGhpbikpCgoKbW9kZWxfUENfbG9uZyA8LSBsbShQQ19sb25nIH4gZ3Jvc3NfbW90b3JfZXhwZXJpZW5jZSArIGZpbmVfbW90b3JfZXhwZXJpZW5jZSwgZGF0YSA9IGRmKQpjaGVja19tb2RlbChtb2RlbF9QQ19sb25nKQpwcmludChzdW1tYXJ5KG1vZGVsX1BDX2xvbmcpKQoKZGZfbG9uZyA8LSBkZiAlPiUKICBkcGx5cjo6c2VsZWN0KGdyb3NzX21vdG9yX2V4cGVyaWVuY2UsIGZpbmVfbW90b3JfZXhwZXJpZW5jZSwgUENfdGhpbiwgUENfbG9uZykgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGMoZ3Jvc3NfbW90b3JfZXhwZXJpZW5jZSwgZmluZV9tb3Rvcl9leHBlcmllbmNlKSwKICAgIG5hbWVzX3RvID0gIm1vdG9yX3R5cGUiLAogICAgdmFsdWVzX3RvID0gIm1vdG9yX3llYXJzIgogICkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGMoUENfdGhpbiwgUENfbG9uZyksCiAgICBuYW1lc190byA9ICJwY190eXBlIiwKICAgIHZhbHVlc190byA9ICJwY19zY29yZSIKICApICU+JQogIG11dGF0ZSgKICAgIG1vdG9yX3R5cGUgPSBkcGx5cjo6cmVjb2RlKG1vdG9yX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3NzX21vdG9yX2V4cGVyaWVuY2UgPSAiZ3Jvc3MgbW90b3IgZXhwZXJpZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmVfbW90b3JfZXhwZXJpZW5jZSAgPSAiZmluZSBtb3RvciBleHBlcmllbmNlIiksCiAgICBwY190eXBlID0gZHBseXI6OnJlY29kZShwY190eXBlLAogICAgICAgICAgICAgICAgICAgICBQQ190aGluID0gIlBDIHRoaW4iLAogICAgICAgICAgICAgICAgICAgICBQQ19sb25nID0gIlBDIGxvbmciKQogICkKCnAgPC0gZ2dwbG90KGRmX2xvbmcsIGFlcyh4ID0gbW90b3JfeWVhcnMsIHkgPSBwY19zY29yZSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAyLCBhbHBoYSA9IC44KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFKSArCiAgZmFjZXRfZ3JpZChwY190eXBlIH4gbW90b3JfdHlwZSwgc2NhbGVzID0gImZyZWVfeSIpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDE0KSArCiAgbGFicyh4ID0gIm1vdG9yIHNraWxsIGV4cGVyaWVuY2UgKHllYXJzKSIsIHkgPSAiIikKcHJpbnQocCkKCmdncGxvdDI6Omdnc2F2ZSgKICAgIGZpbGVuYW1lID0gImZpZ3VyZXMvbW90b3JfZXhwX2luZmx1ZW5jZV9vbl9tb3JwaG9sb2d5X1BDQS5wbmciLAogICAgcGxvdCA9IHAsIHdpZHRoID0gMTAsIGhlaWdodCA9IDgsIGRwaSA9IDMwMCwgZGV2aWNlID0gInBuZyIKICApCgpgYGAKCiMjIHJ1biBhbmFseXNpcwpgYGB7ciBjb3JyX21vcnBob2xvZ3lfYnJhaW5fUFJFLCByZXN1bHRzPSdhc2lzJywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXZhbD1UUlVFfQpkZiA8LSBkYXRhICU+JSBkcGx5cjo6ZmlsdGVyKHRyYWluaW5nID09ICJwcmUiKQoKcGNhX21lYXN1cmVzIDwtIGMoIlBDX3RoaW4iLCAiUENfbG9uZyIpCgpjYXB0aW9uc19wY2EgPC0gbGlzdCgKICBBUV9XTSAgPSAiKipUYWJsZSBTOS5BLioqIENvcnJlbGF0aW9uOiBQQ0EgY29tcG9uZW50cyDDlyBBUSBvZiBXTSBtZWFzdXJlcyAoUFJFKSIsCiAgQVFfQUYgID0gIioqVGFibGUgUzkuQi4qKiBDb3JyZWxhdGlvbjogUENBIGNvbXBvbmVudHMgw5cgQVEgb2YgQUYgR00gdGVybWluYXRpb25zIChQUkUpIiwKICBBUV9TTEYgPSAiKipUYWJsZSBTOS5DLioqIENvcnJlbGF0aW9uOiBQQ0EgY29tcG9uZW50cyDDlyBBUSBvZiBTTEYgSUkvSUlJIEdNIHRlcm1pbmF0aW9ucyAoUFJFKSIsCiAgV00gICAgID0gIioqVGFibGUgUzkuRC4qKiBDb3JyZWxhdGlvbjogUENBIGNvbXBvbmVudHMgw5cgV00gbWVhc3VyZXMgKFBSRSkiLAogIEFGX0wgICA9ICIqKlRhYmxlIFM5LkUuKiogQ29ycmVsYXRpb246IFBDQSBjb21wb25lbnRzIMOXIEFGIGxlZnQgR00gdGVybWluYXRpb25zIChQUkUpIiwKICBBRl9SICAgPSAiKipUYWJsZSBTOS5GLioqIENvcnJlbGF0aW9uOiBQQ0EgY29tcG9uZW50cyDDlyBBRiByaWdodCBHTSB0ZXJtaW5hdGlvbnMgKFBSRSkiLAogIFNMRl9MICA9ICIqKlRhYmxlIFM5LkcuKiogQ29ycmVsYXRpb246IFBDQSBjb21wb25lbnRzIMOXIFNMRiBJSS9JSUkgbGVmdCBHTSB0ZXJtaW5hdGlvbnMgKFBSRSkiLAogIFNMRl9SICA9ICIqKlRhYmxlIFM5LkguKiogQ29ycmVsYXRpb246IFBDQSBjb21wb25lbnRzIMOXIFNMRiBJSS9JSUkgcmlnaHQgR00gdGVybWluYXRpb25zIChQUkUpIgopCgpzdWJ0aXRsZXNfcGNhIDwtIGxpc3QoCiAgQVFfV00gID0gIlBDQSBjb21wb25lbnRzIMOXIEFRIG9mIFdNIG1ldHJpY3MgKFBSRSlcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiLAogIEFRX0FGICA9ICJQQ0EgY29tcG9uZW50cyDDlyBBUSBvZiBBRiBHTSB0ZXJtaW5hdGlvbnMgKFBSRSlcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiLAogIEFRX1NMRiA9ICJQQ0EgY29tcG9uZW50cyDDlyBBUSBvZiBTTEYgSUkvSUlJIEdNIHRlcm1pbmF0aW9ucyAoUFJFKVxuKEJIIHEgPCAwLjI1IG1hcmtlZCAqKSIsCiAgV00gICAgID0gIlBDQSBjb21wb25lbnRzIMOXIFdNIG1lYXN1cmVzIChQUkUpXG4oQkggcSA8IDAuMjUgbWFya2VkICopIiwKICBBRl9MICAgPSAiUENBIGNvbXBvbmVudHMgw5cgQUYgbGVmdCBHTSB0ZXJtaW5hdGlvbnMgKFBSRSlcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiLAogIEFGX1IgICA9ICJQQ0EgY29tcG9uZW50cyDDlyBBRiByaWdodCBHTSB0ZXJtaW5hdGlvbnMgKFBSRSlcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiLAogIFNMRl9MICA9ICJQQ0EgY29tcG9uZW50cyDDlyBTTEYgSUkvSUlJIGxlZnQgR00gdGVybWluYXRpb25zIChQUkUpXG4oQkggcSA8IDAuMjUgbWFya2VkICopIiwKICBTTEZfUiAgPSAiUENBIGNvbXBvbmVudHMgw5cgU0xGIElJL0lJSSByaWdodCBHTSB0ZXJtaW5hdGlvbnMgKFBSRSlcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiCikKCmNvcnJfcmVzdWx0c19wY2EgPC0gbGlzdCgpCgpmb3IgKGZhbSBpbiBuYW1lcyhicmFpbl9mYW1pbGllcykpIHsKCiAgY29ycl9yZXN1bHRzX3BjYVtbZmFtXV0gPC0gY2FsY3VsYXRlX3BjYV9icmFpbl9jb3JyKAogICAgZGYsCiAgICBwY2FfdmFycyA9IHBjYV9tZWFzdXJlcywKICAgIGJyYWluX3ZhcnMgPSBicmFpbl9mYW1pbGllc1tbZmFtXV0KICApCgogIHByaW50KHRhYmxlX3BjYV9icmFpbl9jb3JyKAogICAgY29ycl9yZXN1bHRzX3BjYVtbZmFtXV0sCiAgICBjYXB0aW9uID0gY2FwdGlvbnNfcGNhW1tmYW1dXSwKICAgIHFfc3RhciA9IDAuMjUsCiAgICBicmFpbl9vcmRlciA9IGJyYWluX2ZhbWlsaWVzW1tmYW1dXSwKICAgIHBjYV9vcmRlciA9IHBjYV9tZWFzdXJlcwogICkpCgogIHByaW50KHBsb3RfcGNhX2JyYWluX2hlYXRtYXAoCiAgICBjb3JyX3Jlc3VsdHNfcGNhW1tmYW1dXSwKICAgIHRpdGxlID0gIkNvcnJlbGF0aW9uIiwKICAgIHN1YnRpdGxlID0gc3VidGl0bGVzX3BjYVtbZmFtXV0sCiAgICBxX3N0YXIgPSAwLjI1LAogICAgYnJhaW5fb3JkZXIgPSBicmFpbl9mYW1pbGllc1tbZmFtXV0sCiAgICBwY2Ffb3JkZXIgPSBwY2FfbWVhc3VyZXMsCiAgICBmaWxlbmFtZSA9IHBhc3RlMCgiZmlndXJlcy9jb3JyX2hlYXRtYXBfdG9vbG1ha2luZ19QQ0FfIiwgZmFtLCAiLnBuZyIpCiAgKSkKfQoKcm0oZGYpCgpgYGAKCgojIENoYW5nZSBpbiBQQ0EtYnJhaW4gY29ycmVsYXRpb25zIAoKYGBge3IgY29ycl9tb3JwaG9sb2d5X2NoYW5nZV9leHAsIHJlc3VsdHM9J2FzaXMnLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBldmFsPVRSVUV9CiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgRVhQIGdyb3VwOiBwcmXigJNwb3N0IGNoYW5nZSBpbiBQQ0Egw5cgYnJhaW4gYXNzb2NpYXRpb25zICh0YWJsZSArIGFycm93IHBsb3QpCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZl9leHAgPC0gZGF0YSAlPiUgZHBseXI6OmZpbHRlcihncm91cCA9PSAiZXhwIikKCnBjYV9tZWFzdXJlcyA8LSBjKCJQQ190aGluIiwgIlBDX2xvbmciKQoKIyAtLS0tIFRhYmxlL3Bsb3QgdGV4dCBzY2hlbWUgKG1hdGNoIHlvdXIgUFJFIHN0eWxlKSAtLS0tCmNhcHRpb25zX3BjYV9jaGFuZ2UgPC0gbGlzdCgKICBBUV9XTSAgPSAiKipUYWJsZSBTMTAuQS4qKiBQcmXigJNwb3N0IGNoYW5nZTogUENBIGNvbXBvbmVudHMgw5cgQVEgb2YgV00gbWVhc3VyZXMgKEVYUCkiLAogIEFRX0FGICA9ICIqKlRhYmxlIFMxMC5CLioqIFByZeKAk3Bvc3QgY2hhbmdlOiBQQ0EgY29tcG9uZW50cyDDlyBBUSBvZiBBRiBHTSB0ZXJtaW5hdGlvbnMgKEVYUCkiLAogIEFRX1NMRiA9ICIqKlRhYmxlIFMxMC5DLioqIFByZeKAk3Bvc3QgY2hhbmdlOiBQQ0EgY29tcG9uZW50cyDDlyBBUSBvZiBTTEYgSUkvSUlJIEdNIHRlcm1pbmF0aW9ucyAoRVhQKSIsCiAgV00gICAgID0gIioqVGFibGUgUzEwLkQuKiogUHJl4oCTcG9zdCBjaGFuZ2U6IFBDQSBjb21wb25lbnRzIMOXIFdNIG1lYXN1cmVzIChFWFApIiwKICBBRl9MICAgPSAiKipUYWJsZSBTMTAuRS4qKiBQcmXigJNwb3N0IGNoYW5nZTogUENBIGNvbXBvbmVudHMgw5cgQUYgbGVmdCBHTSB0ZXJtaW5hdGlvbnMgKEVYUCkiLAogIEFGX1IgICA9ICIqKlRhYmxlIFMxMC5GLioqIFByZeKAk3Bvc3QgY2hhbmdlOiBQQ0EgY29tcG9uZW50cyDDlyBBRiByaWdodCBHTSB0ZXJtaW5hdGlvbnMgKEVYUCkiLAogIFNMRl9MICA9ICIqKlRhYmxlIFMxMC5HLioqIFByZeKAk3Bvc3QgY2hhbmdlOiBQQ0EgY29tcG9uZW50cyDDlyBTTEYgSUkvSUlJIGxlZnQgR00gdGVybWluYXRpb25zIChFWFApIiwKICBTTEZfUiAgPSAiKipUYWJsZSBTMTAuSC4qKiBQcmXigJNwb3N0IGNoYW5nZTogUENBIGNvbXBvbmVudHMgw5cgU0xGIElJL0lJSSByaWdodCBHTSB0ZXJtaW5hdGlvbnMgKEVYUCkiCikKCnN1YnRpdGxlc19wY2FfY2hhbmdlIDwtIGxpc3QoCiAgQVFfV00gID0gIlByZeKAk3Bvc3QgY2hhbmdlIGluIFBDQSBjb21wb25lbnRzIMOXIEFRIG9mIFdNIG1ldHJpY3MgKEVYUClcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiLAogIEFRX0FGICA9ICJQcmXigJNwb3N0IGNoYW5nZSBpbiBQQ0EgY29tcG9uZW50cyDDlyBBUSBvZiBBRiBHTSB0ZXJtaW5hdGlvbnMgKEVYUClcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiLAogIEFRX1NMRiA9ICJQcmXigJNwb3N0IGNoYW5nZSBpbiBQQ0EgY29tcG9uZW50cyDDlyBBUSBvZiBTTEYgSUkvSUlJIEdNIHRlcm1pbmF0aW9ucyAoRVhQKVxuKEJIIHEgPCAwLjI1IG1hcmtlZCAqKSIsCiAgV00gICAgID0gIlByZeKAk3Bvc3QgY2hhbmdlIGluIFBDQSBjb21wb25lbnRzIMOXIFdNIG1lYXN1cmVzIChFWFApXG4oQkggcSA8IDAuMjUgbWFya2VkICopIiwKICBBRl9MICAgPSAiUHJl4oCTcG9zdCBjaGFuZ2UgaW4gUENBIGNvbXBvbmVudHMgw5cgQUYgbGVmdCBHTSB0ZXJtaW5hdGlvbnMgKEVYUClcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiLAogIEFGX1IgICA9ICJQcmXigJNwb3N0IGNoYW5nZSBpbiBQQ0EgY29tcG9uZW50cyDDlyBBRiByaWdodCBHTSB0ZXJtaW5hdGlvbnMgKEVYUClcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiLAogIFNMRl9MICA9ICJQcmXigJNwb3N0IGNoYW5nZSBpbiBQQ0EgY29tcG9uZW50cyDDlyBTTEYgSUkvSUlJIGxlZnQgR00gdGVybWluYXRpb25zIChFWFApXG4oQkggcSA8IDAuMjUgbWFya2VkICopIiwKICBTTEZfUiAgPSAiUHJl4oCTcG9zdCBjaGFuZ2UgaW4gUENBIGNvbXBvbmVudHMgw5cgU0xGIElJL0lJSSByaWdodCBHTSB0ZXJtaW5hdGlvbnMgKEVYUClcbihCSCBxIDwgMC4yNSBtYXJrZWQgKikiCikKCiMgcnVuIGFsbCBmYW1pbGllcyBvbmNlCnRpZHlfYWxsIDwtIHJ1bl9wY2FfZmFtaWxpZXNfcHJlcG9zdChkZl9leHAsIGJyYWluX2ZhbWlsaWVzLCBwY2FfdmFycyA9IHBjYV9tZWFzdXJlcykKCmZvciAoZmFtIGluIG5hbWVzKGJyYWluX2ZhbWlsaWVzKSkgewoKICB0aWR5X2ZhbSA8LSB0aWR5X2FsbCAlPiUgZHBseXI6OmZpbHRlcihmYW1pbHkgPT0gZmFtKQoKICAjIGtlZXAgeW91ciBmYW1pbHkgdmFyaWFibGUgb3JkZXIKICBvcmQgPC0gYXMuY2hhcmFjdGVyKGJyYWluX2ZhbWlsaWVzW1tmYW1dXSkKICBvcmQgPC0gb3JkW29yZCAlaW4lIHRpZHlfZmFtJHZhcmlhYmxlXQoKICB0aWR5X2ZhbSA8LSB0aWR5X2ZhbSAlPiUKICAgIGRwbHlyOjptdXRhdGUodmFyaWFibGUgPSBmYWN0b3IodmFyaWFibGUsIGxldmVscyA9IG9yZCkpICU+JQogICAgZHBseXI6OmFycmFuZ2UodmFyaWFibGUpCgogICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICMgVEFCTEUgKHdpZGUgYnkgUEMpCiAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgd2lkZSA8LSBwY2FfcHJlcG9zdF9hc193aWRlX2J5X3BjKHRpZHlfZmFtLCBwY19vcmRlciA9IHBjYV9tZWFzdXJlcykKCiAgcHJpbnQoCiAgICBwcmludF9wY2FfcHJlcG9zdF93aWRlX3RhYmxlKAogICAgICB3aWRlLAogICAgICBjYXB0aW9uID0gY2FwdGlvbnNfcGNhX2NoYW5nZVtbZmFtXV0gJXx8JSBwYXN0ZTAoIlByZeKAk3Bvc3QgY2hhbmdlOiAiLCBmYW0pLAogICAgICBxX3N0YXIgID0gMC4yNQogICAgKQogICkKCiAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIyBQTE9UICh3ZWlnaHRlZCBhcnJvd3MpCiAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgdGlkeV9wbG90IDwtIHRpZHlfZmFtICU+JSBkcGx5cjo6bXV0YXRlKHZhcmlhYmxlID0gYXMuY2hhcmFjdGVyKHZhcmlhYmxlKSkKCiAgcCA8LSBwbG90X2ZhbWlseV9kdW1iYmVsbF9kaXJfZmFjZXQoCiAgICB0aWR5X3Bsb3QsCiAgICBmYW1pbHlfbGFiZWwgICA9IGZhbSwKICAgIG9yZGVyX3ZlYyAgICAgID0gb3JkLAogICAgZmFjZXRfZmFtaWxpZXMgPSBGQUxTRSwKICAgIHRpdGxlICAgICAgICAgID0gIlByZeKAk3Bvc3QgY2hhbmdlIGluIFBDc+KAk2JyYWluIG1lYXN1cmUgYXNzb2NpYXRpb24gKM6UcikiLAogICAgc3VidGl0bGUgICAgICAgPSBzdWJ0aXRsZXNfcGNhX2NoYW5nZVtbZmFtXV0gJXx8JSBwYXN0ZTAoIigiLCBmYW0sICIpXG4oQkggcSA8IDAuMjUgbWFya2VkICopIiksCiAgICBmaWxlbmFtZSA9IHBhc3RlMCgiZmlndXJlcy9wcmUtcG9zdF90b29sbWFraW5nX1BDQV8iLCBmYW0sICIucG5nIikKICApCgogIHByaW50KHApCn0KCnJtKGRmX2V4cCkKYGBgCgojIHByZS1wb3N0IGNoYW5nZSBpbiBiZWhhdmlvcgpgYGB7ciBwbG90X3ByZXBvc3RfY2hhbmdlcywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0nYXNpcycsIGV2YWw9VFJVRX0KIyBQbG90IHByZS1wb3N0IGNoYW5nZXMgZm9yIGV4cGVyaW1lbnRhbCBncm91cAptZWFzdXJlc190b19wbG90IDwtIGMoIlBDX3RoaW4iLCAiUENfbG9uZyIpCnByZXBvc3RfcGxvdCA8LSBwbG90X3ByZXBvc3RfY2hhbmdlX3JhaW5jbG91ZCgKICBkYXRhID0gZGF0YSwKICBtZWFzdXJlcyA9IG1lYXN1cmVzX3RvX3Bsb3QsCiAgdGl0bGUgPSAiRWZmZWN0IG9mIHRyYWluaW5nIgopCnByZXBvc3RfcGxvdApnZ3NhdmUoaGVyZSgicmVzdWx0cyIsICJmaWd1cmVzIiwgInByZXBvc3RfUENBX3RyYWluaW5nX2NoYW5nZXMucG5nIiksIHBsb3QgPSBwcmVwb3N0X3Bsb3QsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNiwgZHBpID0gMzAwKQoKCm1lYXN1cmVzX3RvX3Bsb3QgPC0gYygidG9vbG1ha2luZ19wZXJmb3JtYW5jZSIpCnByZXBvc3RfcGxvdF90b29sIDwtIHBsb3RfcHJlcG9zdF9jaGFuZ2VfcmFpbmNsb3VkKAogIGRhdGEgPSBkYXRhLAogIG1lYXN1cmVzID0gbWVhc3VyZXNfdG9fcGxvdCwKICB0aXRsZSA9ICJFZmZlY3Qgb2YgdHJhaW5pbmciCikKCnByZXBvc3RfcGxvdF90b29sCmdnc2F2ZShoZXJlKCJyZXN1bHRzIiwgImZpZ3VyZXMiLCAicHJlcG9zdF90b29sbWFraW5nX3RyYWluaW5nX2NoYW5nZXMucG5nIiksIHBsb3QgPSBwcmVwb3N0X3Bsb3RfdG9vbCwgd2lkdGggPSA2LCBoZWlnaHQgPSA4LCBkcGkgPSAzMDApCgptZWFzdXJlc190b19wbG90IDwtIGMoInN5bnRhY3RpY19jb21wbGV4aXR5IikKcHJlcG9zdF9wbG90X3N5bnRheCA8LSBwbG90X3ByZXBvc3RfY2hhbmdlX3JhaW5jbG91ZCgKICBkYXRhID0gZGF0YSwKICBtZWFzdXJlcyA9IG1lYXN1cmVzX3RvX3Bsb3QsCiAgdGl0bGUgPSAiRWZmZWN0IG9mIHRyYWluaW5nIgopCgpwcmVwb3N0X3Bsb3Rfc3ludGF4Cmdnc2F2ZShoZXJlKCJyZXN1bHRzIiwgImZpZ3VyZXMiLCAicHJlcG9zdF9zeW50YWN0aWNfY29tcGxleGl0eV90cmFpbmluZ19jaGFuZ2VzLnBuZyIpLCBwbG90ID0gcHJlcG9zdF9wbG90X3N5bnRheCwgd2lkdGggPSA2LCBoZWlnaHQgPSA4LCBkcGkgPSAzMDApCgoKZGZfd2lkZSA8LSBkYXRhICU+JQogIGZpbHRlcihncm91cCA9PSAiZXhwIikgJT4lCiAgc2VsZWN0KHN1YmplY3QsIHRyYWluaW5nLCB0b29sbWFraW5nX3BlcmZvcm1hbmNlLCBzeW50YWN0aWNfY29tcGxleGl0eSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHRyYWluaW5nLAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYyh0b29sbWFraW5nX3BlcmZvcm1hbmNlLCBzeW50YWN0aWNfY29tcGxleGl0eSkpICU+JQogIG11dGF0ZSgKICAgIGRlbHRhX3Rvb2wgID0gdG9vbG1ha2luZ19wZXJmb3JtYW5jZV9wb3N0IC0gdG9vbG1ha2luZ19wZXJmb3JtYW5jZV9wcmUsCiAgICBkZWx0YV9zeW50YXggPSBzeW50YWN0aWNfY29tcGxleGl0eV9wb3N0IC0gc3ludGFjdGljX2NvbXBsZXhpdHlfcHJlCiAgKQoKZGZfZGVsdGEgPC0gZGZfd2lkZSAlPiUKICBmaWx0ZXIoIWlzLm5hKGRlbHRhX3Rvb2wpLCAhaXMubmEoZGVsdGFfc3ludGF4KSkKCmNvcl90ZXN0IDwtIGNvci50ZXN0KGRmX2RlbHRhJGRlbHRhX3Rvb2wsIGRmX2RlbHRhJGRlbHRhX3N5bnRheCwgbWV0aG9kID0gInBlYXJzb24iKQoKcHJlcG9zdF9wbG90X2RlbHRhIDwtIGdncGxvdChkZl9kZWx0YSwgYWVzKHggPSBkZWx0YV90b29sLCB5ID0gZGVsdGFfc3ludGF4KSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIuMiwgc2hhcGUgPSAyNSwgZmlsbCA9ICJncmF5MjAiLCBjb2xvciA9ICJncmF5MjAiLCBhbHBoYSA9IDAuOSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsCiAgICAgICAgICAgICAgY29sb3IgPSBjb2xvciRleHAsCiAgICAgICAgICAgICAgZmlsbCAgPSBjb2xvciRjb24sCiAgICAgICAgICAgICAgc2UgPSBUUlVFLAogICAgICAgICAgICAgIGxpbmV3aWR0aCA9IDEuMSwKICAgICAgICAgICAgICBhbHBoYSA9IDAuMzUpICsKICBhbm5vdGF0ZSgKICAgICJ0ZXh0IiwKICAgIHggPSAtSW5mLCB5ID0gSW5mLAogICAgaGp1c3QgPSAtMC4wNSwgdmp1c3QgPSAxLjEwLAogICAgc2l6ZSA9IDQuNSwKICAgIGxhYmVsID0gc3ByaW50ZigiUGVhcnNvbiByKCVkKSA9ICUuMmYsXG5wID0gJXMsIG4gPSAlZCIsCiAgICAgICAgICAgICAgICAgICAgY29yX3Rlc3QkcGFyYW1ldGVyLAogICAgICAgICAgICAgICAgICAgIHVubmFtZShjb3JfdGVzdCRlc3RpbWF0ZSksCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0Qyhjb3JfdGVzdCRwLnZhbHVlLCBmb3JtYXQgPSAiZyIsIGRpZ2l0cyA9IDMpLAogICAgICAgICAgICAgICAgICAgIG5yb3coZGZfZGVsdGEpKQogICkgKwogIAogIGxhYnMoCiAgICB4ID0gZXhwcmVzc2lvbihEZWx0YX4idG9vbG1ha2luZyAocG9zdCAtIHByZSkiKSwKICAgIHkgPSBleHByZXNzaW9uKERlbHRhfiJzeW50YWN0aWMgY29tcGxleGl0eSAocG9zdCAtIHByZSkiKSwKICAgIHRpdGxlID0gIk5vIGV2aWRlbmNlIG9mIGJlaGF2aW9yIHRyYW5zZmVyIgogICkgKwogIAogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJwbGFpbiIpCiAgKQpwcmVwb3N0X3Bsb3RfZGVsdGEKCiMgZm9yIHBhdGNod29yayA6IHRvIGNvbWJpbmUgc3VicGxvdHMKbGF5b3V0IDwtICIKQUJDQwoiCgpjb21iaW5lZF90cmFuc2ZlciA8LSB3cmFwX3Bsb3RzKHByZXBvc3RfcGxvdF90b29sLCBwcmVwb3N0X3Bsb3Rfc3ludGF4LCBwcmVwb3N0X3Bsb3RfZGVsdGEsIGRlc2lnbiA9IGxheW91dCkgKwogIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gbGlzdChjKCJBIiwgIkIiLCAiQyIpKSkgJgogIHRoZW1lKAogICAgcGxvdC50YWcgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKQogICkKCmNvbWJpbmVkX3RyYW5zZmVyCgpnZ3NhdmUoCiAgZmlsZW5hbWUgPSBoZXJlKCJyZXN1bHRzIiwgImZpZ3VyZXMiLCAiYmVoYXZpb3JfYW5kX3RyYW5zZmVyLnBuZyIpLAogIHBsb3QgPSBjb21iaW5lZF90cmFuc2Zlciwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gNiwgZHBpID0gMzAwLCBkZXZpY2UgPSAicG5nIiwKICBjcmVhdGUuZGlyID0gVFJVRQopCgpgYGA=